方法可以使用 Ruby yield 语句调用关联的代码块一次或多次。我们还可以通过在竖线 (|) 中为 yield 提供参数来将值传递给 block 。就像我在下面所做的一样。
1 def print_name
2 puts "Hello "
3 yield "Vikram"
4 end
5
6 animals = %w( ant bee cat dog elk )
7 animals.each {|animal| puts animal }
8 animals.each
9
10 print_name {|name| puts name}
11 print_name
在我的代码行中,第 11 行给出了一个错误:
`print_name': no block given (yield) (LocalJumpError)
这意味着我们不能在调用方法时不传递代码块的情况下在方法中使用 yield。
我的问题是,如果 ruby 的“each”方法中存在“yield”语句,那么在我上面的代码“animals.each”(引用第 8 行)中如何工作而不出现任何错误?
如果不存在则
animals.each {|animal| puts animal }
这应该行不通。
最佳答案
Ruby 允许您使用 Kernel#block_given?
检查一个 block 是否被传递给当前方法. Array#each
,如文档所述,如果没有给出 block (使用 block_given?
检查),则返回一个枚举器。
与 each
不同,您的 print_name
方法会尝试 yield
而不管是否给出 block ,从而导致第 11 行出现错误。
关于Ruby - 在 Iterator each 中工作 "yield",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37241133/