Ruby 是否有方法将大小传递给`/`to_enum``的`enum`?

Ruby 是否有方法将大小传递给`/`to_enum``的`enum`?,ruby,Ruby,我经常使用二维元素网格,有时需要对这些元素进行枚举,因此我有一个类,如下所示: 类网格 def初始化(宽度、高度) @元素=数组。新建(宽度*高度,默认元素) 结束 定义每个(&block) 返回(:each)的枚举,除非给出块_? @元素。每个(&块) 回归自我 结束 结束 这一直都很好,但直到今天我才意识到,#each返回的枚举器不会懒散地计算大小。我可以手动定义一个枚举数,但是除了每个之外,我还有很多枚举数,这将是一件很乏味的事情 所以我想知道是否有类似于(:method,lazy_si

我经常使用二维元素网格,有时需要对这些元素进行枚举,因此我有一个类,如下所示:

类网格
def初始化(宽度、高度)
@元素=数组。新建(宽度*高度,默认元素)
结束
定义每个(&block)
返回(:each)的枚举,除非给出块_?
@元素。每个(&块)
回归自我
结束
结束
这一直都很好,但直到今天我才意识到,
#each
返回的
枚举器不会懒散地计算大小。我可以手动定义一个
枚举数
,但是除了
每个
之外,我还有很多枚举数,这将是一件很乏味的事情

所以我想知道是否有类似于(:method,lazy_size)
enum_,这样我就可以为(:each width*height)
编写
enum_,您可以传递一个块来计算枚举的大小:

enum_for(:each) { width * height }

如果您计划支持各种类型的枚举数,则可能需要考虑实现MIXIN < /P>


你能进一步解释一下“惰性计算大小”的含义吗?@sawa
Enumerable#count
必须枚举整个集合,而
Enumerator#size
试图惰性地计算大小,即不枚举。显然。。。我试着传递额外的论点,但没用。但这是ruby,传递一个块总是很有效:)谢谢!是的,
#count
将在任何枚举器上工作,但它是O(n),而不是O(1)。
DEFAULT_ELEMENT = ":"

class Grid
  include Enumerable

  def initialize(width, height)
    @elements = Array.new(width * height, DEFAULT_ELEMENT)
  end

  def each
    @elements.each {|i| yield i}
  end

end


p Grid.new(2,2).map {|i| "#{i}-)"}
#=> [":-)", ":-)", ":-)", ":-)"]

p Grid.new(4,6).count
#=> 24