Ruby Proc语法

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记法是什么?救我脱离语法地狱!

谢谢!

tok*_*and 7

当您在呼叫的最后一个参数前加上前缀时,&表明您正在发送阻止而不是正常参数.好吧,在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 次

最近记录:

12 年,2 月 前