質問

昨日ここで提起した質問に対する答えは、次の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) パス :helloeach Proc-slot(ブロックを使用してブロックを作成する場合、ブロックが通常通過する場合)。 :hello.to_proc.call(my_array[0]) 最終的になります my_array[0].send :hello, 、およびのすべての後続のインデックスについても同じです my_array.

等しい:

ranges.sort_by{|r| r.begin}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top