2016-06-21 9 views
2

私は突然、そので無名メソッドの実装に興味があるときに、細胞の宝石を読んでいました。以下Rubyで無名メソッドを定義する方法は?

特にコード:

CommentCell.(@comment).()

、それがメソッド名なし.(arguments)を使用

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

答えは、ソースコード自体のどこかにあると確信しています。しかし、簡単に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 ?!実際にラムダですか?それはクールです:)ありがとう。やってみます。代わりに答えとしてあなたのコメントを入れたいですか? –

+0

@AlexN ok。ありがとう。私はそれをチェックします:) –

答えて

4

.()は、メソッド名が見つからないメソッド呼び出しのようです。これは、callメソッドを呼び出す構文糖です。これは、呼び出しメソッドを定義し、Procまたはlambdaで動作する任意のオブジェクトで使用できます。

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

名前のないメソッド名だけを安全に処理するには、次のようにする必要がありますか? 'def method_missing(m、* args、&block); m == ''ならば; DO_SOMETHING;終了 ' –

+0

あなたの答えを試して、それは働いた。私は見るので... 'method_missing'する必要はなく、' call'は特別なメソッドや予約されたメソッド名のようです。ありがとう:) –

+0

いいえ、 'call'は特別な、または予約されたメソッド名ではありません。他のどのような方法でもあります。 'foo [bar、baz] = quux'が' foo。[] =(bar、baz、quux)に変換されるのとまったく同じ方法で 'foo。()'が 'foo.call() ) 'または' + 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

オハイオ州参照してください...これは非常に便利です!ありがとう:) –

関連する問題