在Crystal中实现惰性枚举器

3

在Ruby中构建自定义的延迟枚举器,可以像这样利用Enumerator

enum = Enumerator.new do |e|
  e << value = ".a"
  loop { e << value = value.next }
end

enum.next # => ".a"
enum.next # => ".b"
enum.next # => ".c"
enum.rewind
enum.next # => ".a"

水晶有什么惯用的方法来模仿这样的事情吗?
1个回答

4
稍微啰嗦一点...看看Iterator<T>.
class DotChar
  include Iterator(String)

  @current : String = ""

  def initialize
    @start = ".a"
    rewind
  end

  def next
    @current.tap { @current = @current.succ }
  end

  def rewind
    @current = @start
  end
end

e = DotChar.new
p e.next # => ".a"
p e.next # => ".b"
p e.next # => ".c"
e.rewind
p e.next # => ".a"

(无法使用 enum 作为标识符,因为它是Crystal中的关键字。)

如果放弃倒带,您可以更简单地完成它:

s = ".a"
e = Iterator.of { s.tap { s = s.succ } }

也许将来会有一种方法可以像Ruby一样做到这一点,但这还在进行中(我希望它还没有被放弃,因为似乎已经停滞了半年)。请参见此问题此拉取请求以获取更多信息。


1
这个PR大部分都很好。我认为它只是在等待一些并发特性到达stdlib,这将使得正确的错误传播成为可能。在那之前,这可能太脆弱了,无法合并。 - Johannes Müller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接