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>
你能进一步解释一下“惰性计算大小”的含义吗?@sawaEnumerable#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