1

コード-I

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

ここから以下のコードblock {}で =>に「hellooo」をsample {"hellooo"}呼び出し て割り当てます。見た目も良く、期待通り。yieldx

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

コードⅡ

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は常に返されます。nilfeed

于 2013-02-02T18:13:06.420 に答える