有没有办法将大小传递给`enum_for` /`to_enum`?

时间:2015-12-17 10:51:52

标签: ruby

我使用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)

2 个答案:

答案 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