What does the "yield" keyword do in Ruby? -
i encountered following ruby code:
class myclass attr_accessor :items ... def each @items.each{|item| yield item} end ... end what each method do? in particular, don't understand yield does.
this example fleshing out sample code:
class myclass attr_accessor :items def initialize(ary=[]) @items = ary end def each @items.each |item| yield item end end end my_class = myclass.new(%w[a b c d]) my_class.each |y| puts y end # >> # >> b # >> c # >> d each loops on collection. in case it's looping on each item in @items array, initialized/created when did new(%w[a b c d]) statement.
yield item in myclass.each method passes item block attached my_class.each. item being yielded assigned local y.
does help?
now, here's bit more how each works. using same class definition, here's code:
my_class = myclass.new(%w[a b c d]) # points `each` enumerator/method of @items array in instance via # accessor defined, not method "each" you've defined. my_class_iterator = my_class.items.each # => #<enumerator: ["a", "b", "c", "d"]:each> # next item on array my_class_iterator.next # => "a" # next item on array my_class_iterator.next # => "b" # next item on array my_class_iterator.next # => "c" # next item on array my_class_iterator.next # => "d" # next item on array my_class_iterator.next # => # ~> -:21:in `next': iteration reached end (stopiteration) # ~> -:21:in `<main>' notice on last next iterator fell off end of array. potential pitfall not using block because if don't know how many elements in array can ask many items , exception.
using each block iterate on @items receiver , stop when reaches last item, avoiding error, , keeping things nice , clean.
Comments
Post a Comment