所以我对Ruby和编码很新,最近发现tap
以及它如何解决我的三明治代码。因此,我尝试使用tap
来清理下面的方法。当我看到我的代码时,我意识到第一个例子看起来更干净,但仍然可以找到第二个例子确实返回原始对象数组的原因。
def sort_arr
my_var = my_arr.sort_by { |obj| obj.price['usd'] }
my_var.reverse
end
这可以工作并根据price方法的值返回我的对象的已排序数组。我以为我能够使用tap
执行此操作,但它会返回原始数组
def sort_arr
my_arr.sort_by { |obj| obj.price['usd'] }.tap do |my_obj|
my_obj.reverse
end
end
答案 0 :(得分:3)
tap
将始终返回调用它的对象(即x.tap { ... }
始终为x
)。
您的方法可以简化为:
def sort_arr
my_arr.sort_by { |obj| obj.price['usd'] }.reverse
end
或者,如果价格是数字,
def sort_arr
my_arr.sort_by { |obj| -obj.price['usd'] }
end
答案 1 :(得分:1)
tap
将始终返回所谓的对象
这种方法的主要目的是"进入"方法链,以便对链中的中间结果执行操作。
您只需使用sort
#For reverse order compare obj2 price with obj1 price
def sort_arr
my_arr.sort { |obj1, obj2| obj2.price['usd'] <=> obj1.price['usd'] }
end
#For increasing order compare obj1 price with obj2 price
def sort_arr
my_arr.sort { |obj1, obj2| obj1.price['usd'] <=> obj2.price['usd'] }
end