簡體   English   中英

Ruby Proc語法

[英]Ruby Proc Syntax

我昨天在這里提出的一個問題的答案是以下一段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表示法是什么奇怪? 從語法地獄救我!

謝謝!

當在呼叫的最后一個參數前加上&前綴時&您會清楚地表明您是在發送一個塊而不是普通參數。 好的,在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"]

[edit]注意:當您意識到這種構造不是語法糖而是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 ,在特殊參數插槽proc-slot中傳遞some_value ,通常保留用於傳遞do-notation塊。

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

任何Proc或響應to_proc都可以在proc插槽中傳遞。 如果您傳遞的對象不是Proc而是對to_proc作出響應,則Ruby將為您在該對象上調用to_proc並將結果傳遞給方法。

Symbol#to_proc的實現是返回一個proc,當傳遞參數時,該proc向該參數發送符號本身的消息。 例如, :hello.to_proc.call(my_obj)將最終執行my_obj.send :hello

因此, my_array.each(&:hello):hello傳遞給proc插槽中的each插槽(如果使用do-notation構成一個塊,通常會在其中傳遞一個塊)。 :hello.to_proc.call(my_array[0])最終是my_array[0].send :hello ,並且對my_array所有后續索引相同。

它等於:

ranges.sort_by{|r| r.begin}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM