2017-09-28 12 views
0

Rubyにはかなり新しく、一般的にコーディングして、最近tapを発見し、サンドイッチコードのいくつかを解決する方法を知っています。だから、tapを使用して私のメソッドをクリーンアップしようとしています。私のコードを見ると、最初の例はより洗練されているように見えますが、2番目の例がオブジェクトの元の配列を返す理由を理解する上で助けになります。sort_byとハッシュをタップ

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 

答えて

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 
+0

sortを使用してコードを最適化することができます! – scarsam

+0

また、['Array#reverse!'](https:// ruby​​)を変更することで、 'x.tap(&:reverse!)'(ここではbangに注意してください) -doc.org/core-2.2.0/Array.html#method-i-reverse-21)。/cc @scarsam – mudasobwa

1

tapは常にそれがこの第一の目的

と呼ばれたオブジェクトを返します。

あなたの方法は、のように簡略化することができますメソッドは、チェーン内の中間結果に対する操作を実行するためにメソッドチェーンに「タップ」することです。

あなただけの説明や提案のためにあなたに@Amadanありがとう

#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 
+0

"あなたは' sort'だけを使ってコードを最適化することができます - 一般的に 'sort'は' sort_by'よりも少ない* space *を使いますが、more * time *( 'O 'log(n log n)'回、 'O(n)'回ブロックを呼び出す 'sort_by'と比較します)。例えば、私のシステムは、 'sort_by'を使って100要素配列を2倍高速にソートします。ほとんどの人はあなたがメモリが足りない場合を除いて ''最適化された ''ソート 'の使用を考慮しません。 – Amadan

+0

'tap'の「主な目的」に関して、私はデバッグでのその使用がすぐそこにあると考えています。例えば、' .tap {| e | 2つの連鎖されたメソッドの間に "e =#{e}}"を置きます。 –

関連する問題