Tag: 调查员

Ruby:在块中重用值而不将其赋值给变量(动态写入对象方法)

在某些情况下,我想将块应用于某个值并使用此块内的值,以将枚举器编码样式用于每个元素。 如果这种方法被称为decompose ,它看起来像: result = [3, 4, 7, 8].decompose{ |array| array[2] + array[3] } # result = 15 # OR result = {:key1 => ‘value’, :key2 => true}.decompose{ |hash| hash[:key1] if hash[:key2] } # result = ‘value’ # OR [min, max] = [3, 4, 7, 8].decompose{ |array| [array.min, array.max] } # [min, max] = [3, […]

Ruby枚举器中的“break”vs“raise StopIteration”

如果我使用Ruby Enumerators来实现生成器和filter: generator = Enumerator.new do |y| x = 0 loop do y < CUTOFF end end.lazy filter = Enumerator.new do |y| loop do i = generator.next y << i if i.even? end end 我是否突破了发电机的回路是否有任何区别? break if x > CUTOFF VS raise StopIteration if x > CUTOFF ? 两者似乎都有效。 我想break会更有效率,但在这里raise更多的惯用语?

在Ruby中克隆一个枚举器?

我有一棵树,我正试图穿越。 当我遍历它时,我会保留一堆枚举器,其中每个枚举器用于枚举树的子节点。 我希望能够复制这个枚举器堆栈并将其交给另一个对象,以便它可以从堆栈状态指示的位置开始遍历树。 当我尝试在Enumerator上调用#dup时,出现错误。 是否可以复制枚举器? 如果没有,我怎么能完成同样的事情? (我已经将一堆整数视为指数,但我担心效率。 这里有一些代码来展示我所看到的…… 第一个枚举器启动后,您无法复制它。 那是我的情况。 a = [1,2,3].each => # a.next => 1 b = a.dup TypeError: can’t copy execution context from (irb):3:in `initialize_copy’ from (irb):3:in `initialize_dup’ from (irb):3:in `dup’ from (irb):3

Ruby – 优雅地比较两个枚举器

我在Ruby(1.9.2)中有两个来自两个不同来源(二进制数据)的长数据流。 这两个源以两个枚举器的forms封装。 我想检查两个流是否完全相同。 我有几个解决方案,但两者看起来都很不优雅。 第一个简单地将两者转换为数组: def equal_streams?(s1, s2) s1.to_a == s2.to_a end 这是有效的,但它在内存方面并不是非常高效,特别是如果流有大量信息。 另一种选择是……呃。 def equal_streams?(s1, s2) s1.each do |e1| begin e2 = s2.next return false unless e1 == e2 # Different element found rescue StopIteration return false # s2 has run out of items before s1 end end begin s2.next rescue StopIteration # s1 […]

Ruby中Enumerator类的用途是什么?

如果我像这样创建一个Enumertor: enum = [1,2,3].each => # enum是一个枚举器。 这个对象的目的是什么? 我不能这样说: enum { |i| puts i } 但我可以这样说: enum.each { |i| puts i } 这似乎是多余的,因为Enumerator是用.each创建的。 它似乎存储了有关each方法的一些数据。 我不明白这里发生了什么。 我确信我们有这个Enumerator类有一些合乎逻辑的原因,但是它能做什么,Array不能呢? 我想也许它是Array和其他Enumerables的祖先,但它似乎不是。 究竟是什么原因导致Enumerator类存在,以及它将在何种上下文中使用?