有一个有用的 Ruby 习惯用法,它使用 tap
允许您创建一个对象,对其进行一些操作并返回它(我在这里仅使用列表作为示例,我的真实代码是更多参与):
def foo
[].tap do |a|
b = 1 + 2
# ... and some more processing, maybe some logging, etc.
a << b
end
end
>> foo
=> [1]
Rails 有一个类似的方法叫做returning
,所以你可以这样写:
def foo
returning([]) do |a|
b = 1 + 2
# ... and some more processing, maybe some logging, etc.
a << b
end
end
这不言而喻。不管你对对象做了多少处理,它仍然是函数的返回值。
在 Python 中我必须写:
def foo():
a = []
b = 1 + 2
# ... and some more processing, maybe some logging, etc.
a.append(b)
return a
而且我想知道是否有办法将这个 Ruby 习惯用法移植到 Python 中。我的第一个想法是使用 with
语句,但是 return with
不是有效的语法。
最佳答案
简短回答:Ruby 鼓励方法链,Python 不鼓励。
我想正确的问题是:Ruby 的 tap
有什么用?
现在我对 Ruby 了解不多,但通过谷歌搜索,我得到的印象是 tap
在概念上用作方法链。
在 Ruby 中,样式:SomeObject.doThis().doThat().andAnotherThing()
非常地道。它是 fluent interfaces 概念的基础, 例如。 Ruby 的 tap
是这种情况的一个特例,您可以动态定义 doThis
而不是 SomeObject.doThis()
。
为什么我要解释这一切?因为它告诉我们为什么 tap
在 Python 中没有很好的支持。需要注意的是,Python 不执行调用链。
例如,Python 列表方法通常返回 None
而不是返回变异列表。 map
和 filter
等函数不是列表方法。另一方面,许多 Ruby 数组方法确实会返回修改后的数组。
除了某些情况,如某些 ORM,Python 代码不使用流畅的接口(interface)。
说到底就是惯用的Ruby和惯用的Python的区别。如果您要从一种语言转到另一种语言,则需要进行调整。
关于python - Ruby 在 Python 中的 tap 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725214/