我正在尝试想出一种优雅的方法来从在 Python 和 Ruby 中产生值的函数创建列表。
在 Python 中:
def foo(x):
for i in range(x):
if bar(i): yield i
result = list(foo(100))
在 ruby 中:
def foo(x)
x.times {|i| yield i if bar(i)}
end
result = []
foo(100) {|x| result << x}
虽然我喜欢使用两种语言工作,但我一直对 Ruby 版本必须初始化列表然后填充它感到有点困扰。 Python 的 yield
导致简单的迭代,这很棒。 Ruby 的 yield
调用一个 block ,这也很棒,但是当我只想填充一个列表时,感觉有点笨拙。
有没有更优雅的 Ruby 方式?
更新 修改了示例以表明函数产生的值的数量不一定等于 x。
最佳答案
因此,对于您的新示例,试试这个:
def foo(x)
(0..x).select { |i| bar(i) }
end
基本上,除非您正在编写自己的迭代器,否则在 Ruby 中您不需要经常使用 yield
。如果您停止尝试使用 Ruby 语法编写 Python 习语,您可能会做得更好。
关于python - 在 Ruby 和 Python 中使用 yield 创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/608951/