我使用2d网格元素工作很多,有时我需要枚举这些元素,所以我有一个类似于这样的类:
class Grid
def initialize(width, height)
@elements = Array.new(width * height, DEFAULT_ELEMENT)
end
def each(&block)
return enum_for(:each) unless block_given?
@elements.each(&block)
return self
end
end
这一直工作得很好,但直到今天我才意识到Enumerator
返回的#each
并没有懒散地计算大小。我可以手动定义Enumerator
,但除了each
之外我还有很多枚举器,这将是乏味的。
所以我想知道是否有类似enum_for(:method, lazy_size)
的内容,以便我可以写enum_for(:each width * height)
。
答案 0 :(得分:2)
您可以将一个块传递给计算枚举大小的enum_for
:
enum_for(:each) { width * height }
答案 1 :(得分:0)
如果您计划支持各种类型的调查员,可能应该考虑实施Enumerable
mixin
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