在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"
水晶有什么惯用的方法来模仿这样的事情吗?
在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"
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一样做到这一点,但这还在进行中(我希望它还没有被放弃,因为似乎已经停滞了半年)。请参见此问题和此拉取请求以获取更多信息。