【发布时间】:2010-10-11 04:07:38
【问题描述】:
我正在尝试想出一种优雅的方法来从一个在 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 调用了一个块,这也很棒,但是当我只想填写一个列表时,感觉有点笨拙。
还有更优雅的 Ruby 方式吗?
UPDATE 重新设计了示例,以表明函数产生的值的数量不一定等于 x。
【问题讨论】:
-
Ruby 和 Python 的“yield”在语义上是不同的。 Python 的产量比 ruby 的产量几乎更接近 ruby 的 Fiber.yield。