2010-12-22 11 views
1

私はここで昨日れた質問に対する答えたRubyコードの以下の部分:ルビーPROC構文

def overlap?(r1,r2) 
    r1.include?(r2.begin) || r2.include?(r1.begin) 
end 

def any_overlap?(ranges) 
    ranges.sort_by(&:begin).each_cons(2).any? do |r1,r2| 
    overlap?(r1, r2) 
    end 
end 

私はeach_cons得るが、奇妙な&:begin表記は何ですか?構文地獄から私を救いなさい!

ありがとうございます!

+0

これは多かれ少なかれ[[ClassOne、ClassTwo] .each(&:my_method) 'を理解する](http://StackOverflow.Com/q/99318/)、[マップRubyではどういう意味ですか?(http://StackOverflow.Com/q/1217088/)、[これはルビーではどういう意味ですか: '&:capitalize'](http://StackOverflow.Com/q/1792683 /)、[Ruby/Ruby on Railsアンパサンドコロンショートカット](http://StackOverflow.Com/q/1961030/)、[Ruby: '&:symbol]構文(http://StackOverflow.Com/q/2096975 /)、[これは最後のRubyコンストラクトと呼ばれていますか?](http://StackOverflow.Com/q/2211751/)、... –

+0

... [あなたは '&:'演算子Rubyで?](http://StackOverflow.Com/q/2259775/)、[このRubyコードで 'map(&:name)'は何をするのですか?](http://StackOverflow.Com/q/2388337/ )、[[:+ 'と'&+ 'とは何ですか?](http://StackOverflow.Com/q/2697024/)とPost.published.collect(&:views_count)の['&:views_count']](http://StackOverflow.Com/q/3888044/) 。 –

答えて

7

、あなたが通常引数ブロックを送信していないことが明らかになっている&と呼び出しの最後の引数の前に付けるとき。 OK、method(&:something):somethingprocではないので、Rubyは自動的にto_procというメソッドを呼び出して実際のブロックを取得します。そして、(今も、バニラルビー)Railsの男が巧みとしてそれを定義した:あなたが行うことができる理由

class Symbol 
    def to_proc 
    proc { |obj, *args| obj.send(self, *args) } 
    end 
end 

だこと:

>> [1, 2, 3].map(&:to_s) # instead of [1, 2, 3].map { |n| n.to_s } 
=> ["1", "2", "3"] 

[編集]注:この構造は全く糖衣構文ではないことを実現Rubyが提供する一般的なインフラストラクチャでは、他のクラスのために独自のto_procを実装することを止めるものはありません。 &:methodは引数が許可されていないため、制限されていませんでしたか?

class Array 
    def to_proc 
    proc { |obj, *args| obj.send(*(self + args)) } 
    end 
end 

>> ["1", "F", "FF"].map(&[:to_i, 16]) 
=> [1, 15, 255] 
1

それは等しい:

ranges.sort_by{|r| r.begin} 
+0

申し訳ありませんが、それはあまり説明ではありません! – mbm

+0

申し訳ありません、@mbm。理由は&to_procメソッドを呼び出します。 –

1

my_method(&some_value)通常行う記法ブロックを通過させるために予約特別な引数スロット、PROCスロットにsome_valueを渡し、my_methodを呼び出すことを意味します。

my_block = lambda { puts "hello" } 
(1..3).each(&my_block) 

Procであるか、またはto_procに応答する任意のオブジェクトは、PROCスロットに渡されることが許可されます。 Procではないが、to_procに応答するオブジェクトを渡すと、Rubyはそのオブジェクトに対してto_procを呼び出し、結果をメソッドに渡します。

Symbol#to_procの実装は、引数を渡されたときにシンボル自体であるメッセージをその引数に送るprocを返すことです。たとえば、:hello.to_proc.call(my_obj)my_obj.send :helloになります。

したがってmy_array.each(&:hello)は、proc-slot(ブロックを作成するためにdo表記を使用した場合、通常はブロックが渡される)内の:hello〜を渡します。 :hello.to_proc.call(my_array[0])my_array[0].send :helloとなり、以後のすべてのインデックスについてはmy_arrayとなります。

関連する問題