Are there something like Python generators in Ruby?

后端 未结 4 917
遇见更好的自我
遇见更好的自我 2020-12-13 09:09

I am new to Ruby, is there a way to yield values from Ruby functions? If yes, how? If not, what are my options to write lazy code?

4条回答
  •  无人及你
    2020-12-13 10:16

    Ruby's yield keyword is something very different from the Python keyword with the same name, so don't be confused by it. Ruby's yield keyword is syntactic sugar for calling a block associated with a method.

    The closest equivalent is Ruby's Enumerator class. For example, the equivalent of the Python:

    def eternal_sequence():
      i = 0
      while True:
        yield i
        i += 1
    

    is this:

    def eternal_sequence
      Enumerator.new do |enum|
        i = 0
        while true
          enum.yield i # <- Notice that this is the yield method of the enumerator, not the yield keyword
          i +=1
        end
      end
    end
    

    You can also create Enumerators for existing enumeration methods with enum_for. For example, ('a'..'z').enum_for(:each_with_index) gives you an enumerator of the lowercase letters along with their place in the alphabet. You get this for free with the standard Enumerable methods like each_with_index in 1.9, so you can just write ('a'..'z').each_with_index to get the enumerator.

提交回复
热议问题