我试图确定在Ruby中是否有可能确定一个方法链何时完成调用。
假设我有一个从数据库中检索信息的类。我通常只想调用类的一个示例来访问所有包含的数据,但在很多情况下,我会链接附加的方法来应用过滤器等。目前,实际的数据检索是由一个总是最后调用的方法执行的,如下所示:
all_data = data_retriever.run
filtered_data = data_retriever.condition({k1: v1}).run
filtered_data = data_retriever.condition({k1: v1}).condition({k2: v2}).run
这很好用,但我不禁想到Ruby可能有办法做到这一点,而不必在每次使用结束时都添加.run
这样的方法。我的类有可能“知道”我什么时候完成了方法链接吗?比如在所有链接的方法被调用后执行的钩子?
class DataRetriever
@conditions = {}
def initialize()
end
def condition(condition_hash)
@conditions << condition_hash
end
#...
def after_chains
# run the data retrieval code using the contents of @conditions
end
end
1条答案
按热度按时间dced5bon1#
我的类有可能“知道”我什么时候完成了方法链接吗?
不,链接方法等同于一个接一个地调用它们。被调用的方法无法区分调用样式。这实际上是好的,考虑以下几点:
在上面的示例中,您可能不希望第一行已经触发了数据检索。
Ruby可能有一种方法来做到这一点,而无需在每次使用结束时都添加类似
.run
的方法除了
run
之外,您还可以使用一个更微妙的入口点来触发执行。each
是Ruby的默认枚举方法:发动机罩下:(有多种方法可以实现这一点)
只要确保在添加更多条件时使
@data
无效(或者freeze
run
之后的对象)。你甚至可以从
inspect
调用each
:(您可能需要缩写长数据)在IRB中: