canvas教程

Melborne さんの華麗な技巧を鑑賞する

字号+ 作者:H5之家 来源:H5之家 2015-11-21 10:42 我要评论( )

落ちていくRubyistのためのMethopオブジェクト すごく技巧的なので驚きました。何だかよくわからなかったので、調べてみました。まずコピペです。 class Methop

落ちていくRubyistのためのMethopオブジェクト
すごく技巧的なので驚きました。何だかよくわからなかったので、調べてみました。

まずコピペです。

.[](method) new(method).build (method) @method = method ->arg, obj{ obj.send(@method, arg) }.curry = Methop[:+] .map(&]) #=>["rubyist", "violinist", "novelist"]

補足などして、多少書き直してみます。

.[](method) a = Methop.new(method) a.build (method) @method = method {|arg, obj| obj.send(@method, arg)}.curry end end plus = Methop[:+] p .map &plus.call() #=>["rubyist", "violinist", "novelist"]

まずクラスbuild によって与えられる Proc オブジェクトが入ります。インスタンス変数 @method には、演算子 + が(ここでは Symbol として)入ります。

map 実行時に、レシーバーである Array の要素が次々に Proc オブジェクトの引数 obj に入ります。plus.call('ist') で引数 arg に "ist" が入り、Proc オブジェクトが実行されます。前に付いている & は、その Proc オブジェクトをブロックに直し、map に与えています(参照)。これでお終いです。すごいですね。


上のキモを例示しておきます。

a = ->(s, t){t + s}.curry [, ].map &a.call() #=>["rubyist", "violinist"]


こういうことのできる Ruby は本当におもしろい言語ですね。わかってみればとても美しいではないか。それにしても、ブロックという言語仕様は Matz が気に入っていると云うとおり、味のあるやつですなあ。


※追記
なお、元のコードで map() となっている括弧は、引数を括っているわけではないと思います。map は引数を取らないので。ただブロックをラップしているだけなのではないでしょうか。いや、[1, 2, 3].map({|i| i ** 2}) がエラーになるからちがうかな。どうなのでしょう。ちなみに、%w|perl, python, ruby|.map(&:upcase) の map と括弧の間に空白を入れるとエラーになるから、特殊な構文なのですかね。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评