質問
昨日ここで提起した質問に対する答えは、次のRubyコードでした。
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
表記?構文地獄から私を救ってください!
ありがとう!
解決
コールの最後の引数をプレフィックスすると &
あなたはあなたがブロックを送っていて、 正常 口論。わかりました、in method(&:something)
, :something
ではなく、シンボルです Proc, 、したがって、Rubyは自動的にメソッドを呼び出します to_proc
本物のブロックを取得します。そして、Railsの男(そして今もバニラRuby)が巧妙にそれを定義しました:
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]
他のヒント
my_method(&some_value)
呼び出すことを意味します my_method
, 、通過 some_value
特別な引数スロットでは、通常、do-notationブロックを通過するために予約されています。
my_block = lambda { puts "hello" }
(1..3).each(&my_block)
a Proc
または応答する to_proc
proc-slotで渡されることが許可されています。ではないオブジェクトを渡す場合 Proc
しかし、それに応答します to_proc
, 、それからルビーが電話します to_proc
あなたのためのオブジェクトで、結果をメソッドに渡します。
の実装 Symbol#to_proc
引数に合格したときに、その引数にシンボル自体であるメッセージを送信するProcを返すことです。例えば、 :hello.to_proc.call(my_obj)
やります my_obj.send :hello
.
それで my_array.each(&:hello)
パス :hello
に each
Proc-slot(ブロックを使用してブロックを作成する場合、ブロックが通常通過する場合)。 :hello.to_proc.call(my_array[0])
最終的になります my_array[0].send :hello
, 、およびのすべての後続のインデックスについても同じです my_array
.
等しい:
ranges.sort_by{|r| r.begin}