[英]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.