2016-06-21 44 views
2

當我突然對documentation中未命名方法的實現感到好奇時,我正在閱讀單元格寶石。如何在Ruby中定義未命名的方法?

特別下面的代碼:

CommentCell.(@comment).()

cell(:comment, @song).(:index)

其中它使用.(arguments)沒有方法名。

我確定答案只是在源代碼本身的某個地方。但簡單地看Cell::ViewModel並不能立即幫助我,所以我只是想知道如果有人知道如何在徹底檢查源代碼之前做到這一點,並希望滿足我的好奇心。

我可以在應用程序中看到它的一些用法,我將很快做出來。

+0

看看這個答案:[我可以重寫'。 '指向數組的索引?](http://stackoverflow.com/questions/37067744/can-i-override-digit-to-point-at-an-index-for-an-array/37067983 #37067983) – AlexN

+0

@potashin Ohh ?!它實際上是一個lambda?這很酷:)謝謝。我會嘗試一下。您想將您的評論作爲答案嗎? –

+0

@AlexN ok。謝謝。我會檢查出:) –

回答

4

.()看起來像缺少方法名稱的方法調用。這是調用call方法的語法糖。它可以與任何定義呼叫方法的對象一起使用,並可與Proclambda一起使用。

class Test 
    def call 
    puts "test" 
    end 
end 

t = Test.new 
t.() 
# => "test" 
lambda {puts "test"}.() 
Proc.new {puts "test"}.() 

但還有其他可能的解決方案在.()上作出反應。您可以覆蓋method_missing或設置別名。

class Test 
    def test 
    puts "test" 
    end 

    alias call test; 
end 

t = Test.new 
t.() 
# => "test" 
+0

爲了只安全地處理noname方法名稱,是否需要如下所示? 'def method_missing(m,* args,&block);如果m =='';做一點事;結束' –

+0

試過你的答案,它的工作。我看到...所以它不需要是'method_missing',看起來像'call'是一個特殊或保留的方法名稱。謝謝:) –

+0

不,''call'不是一個特殊或保留的方法名稱。這是一種和其他方法一樣的方法。這就是'foo。()'被轉換爲'foo.call()'的方式,'foo [bar,baz] = quux'被轉換爲'foo。[] =(bar,baz,quux )'或'+ foo'被轉換爲'foo。+ @()'或'not foo'被轉換爲'foo。!()'。 –

1

如果你想找出方法來調用語法的一個特定部分翻譯,你可以嘗試出自己:

class << foo = BasicObject.new 
    def method_missing(meth, *args) 
    $>.puts "`foo.#{meth}(#{args.inspect[1...-1]})`" 
    end 

    BasicObject.instance_methods.each(&method(:undef_method)) 
end 

print '`foo.(1, 2, 3)` gets translated to ' 
foo.(1, 2, 3) 
# `foo.(1, 2, 3)` gets translated to `foo.call(1, 2, 3)` 

print '`not foo` gets translated to ' 
not foo 
# `not foo` gets translated to `foo.!()` 

print '`+foo` gets translated to ' 
+foo 
# `+foo` gets translated to `[email protected]()` 

print '`~foo` gets translated to ' 
~foo 
# `~foo` gets translated to `foo.~()` 

print '`foo[1, 2, 3] = 4` gets translated to ' 
foo[1, 2, 3] = 4 
`foo[1, 2, 3] = 4` gets translated to `foo.[]=(1, 2, 3, 4)` 

等等......

正如你所看到的,foo.(bar, baz)被翻譯成foo.call(bar, baz)

+0

哦,我明白了......這非常方便!謝謝 :) –

相關問題