产量混淆调用外部块

时间:2013-02-02 17:57:09

标签: ruby

CODE-I

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

在下面的代码中block {}来自此处=> sample {"hellooo"}打来电话 yield并将“hellooo”分配给x。看起来很好并且符合预期。

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

CODE-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

1 个答案:

答案 0 :(得分:1)

next不会阻止。所以如果你把它传给一个,它就会忽略它。

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