1

代码-I

def sample
  x = "hi"
  puts " #{x}"
  x = yield
  puts " #{x}"
end

在下面的代码block {}中 =>sample {"hellooo"}调用 yield并将“hellooo”分配给x. 看起来不错,符合预期。

sample{'helloo'}
# >>  hi
# >>  helloo

代码-II

o = Object.new
def o.each
  x = yield
  p x
  x = yield
  p x
  x = yield
  p x
end
e = o.to_enum # => #<Enumerator: #<Object:0x007fd1d20494e8>:each>

为什么在下面的调用中没有发生同样的情况e.next "sample",因为 p 没有打印任何东西?

e.next {"sample"} # => nil
e.next # => nil
# >> nil

编辑(这里是如何enum#feed在 的帮助下改变的yield?)

o = Object.new
=> #<Object:0x2299d88>
def o.each
x = yield         
p x       
x = yield
p x 
x = yield
p x 
end
=> nil
e=o.to_enum
=> #<Enumerator: #<Object:0x2299d88>:each>
e.next
=> nil
e.feed "hi"
=> nil
e.next
"hi"
=> nil
4

1 回答 1

1

next不占用块。因此,如果您通过它,它只会忽略它。

next使用枚举器的方法时,无法模拟从块返回的内容。使用 时to_enum,分配给该each方法的块将始终返回nil,除非该feed方法先前提供了一个值。

于 2013-02-02T18:13:06.420 回答