当使用Proc.new v.&符号时,为什么ruby中的break语句表现不同?

Sal*_*cha 8 ruby ruby-on-rails proc-object

块的break语句(根据Ruby Programming Language)定义如下:

它导致块返回到它的迭代器,迭代器返回到调用它的方法.

因此,当运行以下代码时,它会导致LocalJumpError.

def test
    puts "entering test method"
    proc = Proc.new { puts "entering proc"; break }
    proc.call # LocalJumpError: iterator has already returned
    puts "exiting test method"
end
test
Run Code Online (Sandbox Code Playgroud)

虽然以下代码不会抛出LocalJumpError.&符号有什么特别之处?&符号是否隐含使用Proc.new?

def iterator(&proc)
    puts "entering iterator"
    proc.call # invoke the proc
    puts "exiting iterator" # Never executed if the proc breaks
end

def test
    iterator { puts "entering proc"; break }
end
test
Run Code Online (Sandbox Code Playgroud)

换句话说,我读了&符号作为进入Proc.new呼叫的手段.此时行为应该与第一个代码段相同.

def iterator (p = Proc.new { puts "entering proc"; break})
...
end
Run Code Online (Sandbox Code Playgroud)

免责声明:我是新手学习语言(ruby 1.9.2),因此将欣赏参考资料和详细的概要.

Ale*_*x D 8

break使块块的调用者返回.在以下代码中:

proc = Proc.new { break }
Run Code Online (Sandbox Code Playgroud)

转换为Proc对象的块的"调用者"是Proc.new.break应该让块的调用者返回,但Proc.new已经返回.

在这段代码中:

def iterator(&b); b.call; end
iterator { break }
Run Code Online (Sandbox Code Playgroud)

块的调用者是iterator,所以它iterator返回.