Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中有类似Python生成器的东西吗?_Ruby_Lazy Evaluation - Fatal编程技术网

Ruby中有类似Python生成器的东西吗?

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新手,有没有办法从Ruby函数中
产生
值?如果是,如何进行?如果没有,我可以选择什么来编写惰性代码?

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