我正在经历一个尝试避免临时变量和过度使用条件的阶段,我可以使用更流畅的编码风格。我非常喜欢#tap
在我想要获得我需要返回的价值的地方使用它,但在我返回它之前做一些事情。
def fluid_method
something_complicated(a, b, c).tap do |obj|
obj.update(:x => y)
end
end
比。程序:
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
比。程序:
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
我可以在这里遵循哪些其他模式。我意识到这对某些人来说只是无意义的糖,我应该转向更有趣的问题,但我正在努力学习以更实用的风格写作,所以我只是好奇长期的 rubyist 已经确定了什么成为解决此类情况的好方法。这些例子被大大简化了。