gpt4 book ai didi

ruby - 类似 tap 的组合方法,但能够返回不同的值?

转载 作者:数据小太阳 更新时间:2023-10-29 06:26:36 34 4
gpt4 key购买 nike

我正在经历一个尝试避免临时变量和过度使用条件的阶段,在这个阶段我可以使用更流畅的编码风格。我非常喜欢在想要获取需要返回的值的地方使用 #tap,但在返回它之前对其进行一些处理。

def fluid_method
something_complicated(a, b, c).tap do |obj|
obj.update(:x => y)
end
end

vs。程序:

def non_fluid_method
obj = something_complicated(a, b, c)
obj.update(:x => y)
obj # <= I don't like this, if it's avoidable
end

显然上面的示例很简单,但这在 ruby​​ 社区中仍然是一种非常常见的编码风格。有时我也会使用 #inject 通过一系列过滤器传递对象:

things.inject(whatever) do |obj, thing|
thing.filter(obj)
end

vs。程序:

obj = whatever
things.each do |thing|
obj = thing.filter(obj)
end
obj

现在我面临重复使用如下条件,并寻找更流畅的方法来处理它:

def not_nice_method
obj = something_complex(a, b, c)
if a_predicate_check?
obj.one_more_method_call
else
obj
end
end

(稍微)更简洁的解决方案是以重复为代价避免使用临时变量:

def not_nice_method
if a_predicate_check?
something_complex(a, b, c).one_more_method_call
else
something_complex(a, b, c)
end
end

不过,我情不自禁地想要在此处使用 几乎 之类的东西,例如 #tap

这里我还可以遵循哪些其他模式。我意识到这对某些人来说只是无意义的糖分,我应该转向更有趣的问题,但我正在努力学习以更实用的风格写作,所以我很好奇长期的 ruby​​ists 已经确定了什么是解决此类情况的好方法。这些示例已大大简化。

最佳答案

定义对象#as:

class Object
def as
yield self
end
end

现在你可以写:

def not_sure_this_is_nice_enough_method1
something_complex(a, b, c).as do |obj|
a_predicate_check? ? obj.one_more_method_call : obj
end
end

关于ruby - 类似 tap 的组合方法,但能够返回不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7878687/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com