ruby - ruby 是否支持递归枚举器?

标签 ruby

我正在编写一个方法来合并两个数字流,并且我有两个替代实现:

def merge1(l1, l2)
    Enumerator.new do |yielder|
        h = case l1.peek <=> l2.peek
                when -1 then l1.next
                when +1 then l2.next
                else l1.next; l2.next
                end
        yielder << h
        yielder << merge1(l1, l2).next
    end.lazy              
end

def merge2(l1, l2)
    Enumerator.new do |yielder|
        loop do
            h = case l1.peek <=> l2.peek
                    when -1 then l1.next
                    when +1 then l2.next
                    else l1.next; l2.next
                    end
            yielder << h
        end
    end.lazy              
end
puts merge2((1..Float::INFINITY).lazy.map {|x| x * 2}, (1..Float::INFINITY).lazy.map {|x| x * 3}).first(10)

但是 merge1 只打印“2 3”,而 merge2 产生正确的结果。

最佳答案

您需要生成子枚举器生成的每个项目:

def merge1(l1, l2)
    Enumerator.new do |yielder|
        h = case l1.peek <=> l2.peek
                when -1 then l1.next
                when +1 then l2.next
                else l1.next; l2.next
                end
        yielder << h
        merge1(l1, l2).each do |h| # <----
          yielder << h             # <----
        end                        # <----
    end.lazy              
end

关于ruby - ruby 是否支持递归枚举器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22278126/

相关文章:

ruby-on-rails - 没有方法错误 - 从 ruby​​stutorial.org 保存

ruby-on-rails - 如何优雅地处理 NilClass

ruby - 如何使用 rspec 测试 CLI 的标准输入

ruby - 如何删除 Ubuntu 库存 Ruby 1.8?不恰当

ruby-on-rails - FFMPEG,如何在我方便的时候命名输出文件?

ruby - 使用 HTTParty 会使 Sinatra 崩溃

ruby-on-rails - Ruby 迭代版本号

javascript - Ruby on Rails - 将地理编码器对象作为谷歌地图标记数组

ruby - 字符串包含 NUL 字节

ruby - 使用包含在另外两个数组中的信息创建一个数组