mbm*_*mbm 1 ruby syntax proc-object
我昨天在这里提出的问题的答案是以下一段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
Run Code Online (Sandbox Code Playgroud)
我明白了each_cons
,但奇怪的&:begin
记法是什么?救我脱离语法地狱!
谢谢!
当您在呼叫的最后一个参数前加上前缀时,&
表明您正在发送阻止而不是正常参数.好吧,在method(&:something)
,:something
是一个符号,而不是一个proc,所以Ruby自动调用该方法to_proc
来获得一个真正的块.而Rails的人(现在也是vanilla Ruby)巧妙地将其定义为:
class Symbol
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
end
Run Code Online (Sandbox Code Playgroud)
这就是你能做到的原因:
>> [1, 2, 3].map(&:to_s) # instead of [1, 2, 3].map { |n| n.to_s }
=> ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)
[编辑]注意:当你意识到这种构造不是合成糖而是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]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2285 次 |
最近记录: |