Ruby中有类似Python生成器的东西吗?
我是Ruby新手,有没有办法从Ruby函数中Ruby中有类似Python生成器的东西吗?,ruby,lazy-evaluation,Ruby,Lazy Evaluation,我是Ruby新手,有没有办法从Ruby函数中产生值?如果是,如何进行?如果没有,我可以选择什么来编写惰性代码?Ruby的yield关键字与同名的Python关键字有很大的不同,所以请不要对此感到困惑。Ruby的yield关键字是调用与方法关联的块的语法糖 最接近的等价物是Ruby的枚举器类。例如,Python的等价物: def eternal_sequence(): i = 0 while True: yield i i += 1 这是: def eternal_seq
产生值?如果是,如何进行?如果没有,我可以选择什么来编写惰性代码?Ruby的yield
关键字与同名的Python关键字有很大的不同,所以请不要对此感到困惑。Ruby的yield
关键字是调用与方法关联的块的语法糖
最接近的等价物是Ruby的枚举器类。例如,Python的等价物:
def eternal_sequence():
i = 0
while True:
yield i
i += 1
这是:
def eternal_sequence
Enumerator.new do |enum|
i = 0
while true
enum.yield i # <- Notice that this is the yield method of the enumerator, not the yield keyword
i +=1
end
end
end
def\u序列
Enumerator.new do | enum|
i=0
虽然是真的
enum.yield i#我见过这样的用法,请看以下示例:
如果您希望惰性地生成值,@Chuck的答案是正确的
如果您希望对集合进行惰性迭代,Ruby 2.0引入了新的.lazy
枚举器
range = 1..Float::INFINITY
puts range.map { |x| x+1 }.first(10) # infinite loop
puts range.lazy.map { |x| x+1 }.first(10) # [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Ruby使用Enumerable::Generator
,支持开箱即用的生成器:
require 'generator'
# Generator from an Enumerable object
g = Generator.new(['A', 'B', 'C', 'Z'])
while g.next?
puts g.next
end
# Generator from a block
g = Generator.new { |g|
for i in 'A'..'C'
g.yield i
end
g.yield 'Z'
}
# The same result as above
while g.next?
puts g.next
end
事实上,在Ruby 1.9中,枚举器是使用光纤实现的。实际上,这是添加它们的主要原因之一,因为在Ruby 1.8中,Enumerator使用continuations,但这是a)相当笨拙,b)在当时,continuations将从Ruby语言中删除。0.step
是自1.9以来的一个永久枚举器
require 'generator'
# Generator from an Enumerable object
g = Generator.new(['A', 'B', 'C', 'Z'])
while g.next?
puts g.next
end
# Generator from a block
g = Generator.new { |g|
for i in 'A'..'C'
g.yield i
end
g.yield 'Z'
}
# The same result as above
while g.next?
puts g.next
end