19

最新のRubyバージョンをチェックして、最新の変更を少し試してみました。私が最初にやろうとしたのは、Python呼び出し可能ファイルで行うのと同じようにRuby lambda / block/procを呼び出すことでした。

a = lambda {|x| puts x}
a.call(4) # works, and prints 4
a[4] # works and prints 4
a.(4) # same
a(4) # undefined method 'a' for main:Object

最後の呼び出しができないのはなぜですか?それはありますか?

4

2 に答える 2

10

()これは、rubyではオブジェクトのメソッドを定義できないためです。メソッドを定義できない理由()は、おそらく、メソッド呼び出しで括弧がオプションであるという事実によるものです。

そして、その価値については、http://github.com/coderrr/parenthesis_hacks/blob/master/lib/lambda.rbを使用してラムダを呼び出すことができるハックがあり() ます

于 2010-01-19T22:25:08.083 に答える
6

Rubyは基本的に100%オブジェクト指向ですが、便利さのためにこの事実を隠そうとすることがありますか?親しみやすさ?

基本的に、「トップレベルで」定義された関数は、実際にはグローバルオブジェクトのメソッドとして定義されます。これを機能させるために、指定子を使用しない呼び出しは、実際には、上記のグローバルオブジェクトでその名前のメソッドを呼び出すように変換されます。このスタイルは、物事をよりスクリプト的に見せます。Rubyはあなたの最後の例でそれを行おうとしています。

最初の2つの例は、procオブジェクトのメソッドにアクセスしようとしていることをRubyが認識しているため、正常に解析され[]ます。定義できるメソッドにすぎないことを忘れないでください。ドットは「このメッセージをこのオブジェクトに送信する」(この場合は)を意味するため、明示的なドットが付いているものも機能しますa

私はそれが何も「解決」しないことを知っていますが、それが少し役立つことを願っています。

于 2009-12-03T23:59:20.453 に答える