sort_by并点击哈希

时间:2017-09-28 04:25:18

标签: ruby sorting object methods

所以我对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

2 个答案:

答案 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