2011-01-28 9 views
0

オブジェクト#タップ質問

+2

[Stringオブジェクトの 'tap'メソッドで期待される結果が返されません](http://stackoverflow.com/questions/1331976/the-tap-method-on-string-object-doesnt-return -expected-result) –

答えて

3

配列を変更しない第二のスニペットは、このスニペットは、なぜ同じ理由:

def foo(x) 
    x = [1] 
end 

a = [] 
foo(a) 

は、変数は変更されません。あなたのコードの変数xはブロックのスコープのローカルなので、何かを割り当てることができますが、割り当ては外部には見えません(Rubyは値渡しの言語です)。

はもちろん、ブロックはまた、彼らは宣言されたローカル変数のクロージャを持っているので、これは動作します:

def foo(x) 
    yield(x) 
end 

b = [] 
foo(123) do |x| 
    b = [1] 
end 

p b # outputs [1] 
+0

ローカル変数...もちろんです。ありがとう! – artemave

0

最初のメソッドは空の配列の最後に1を置きます。あなたは空の配列ではなく、あなたがそれを試してみて、複製う1であると言うカントと同じよう...

b = [].tap do |x| 
    x.unshift(1) 
end 

ではこれはまだあなたが使用することができる方法を見てみ呼び出している一例に過ぎません入力して配列を作成します。

Array.methods.sort 

すべてのベストと幸運

0

これはやや無関係である - それ[].tapイディオムが恐ろしいです。あなたはそれを使用すべきではありません。レールコードでそれを使用した多くの人々でさえ、恐ろしいことを認め、もはやそれを使用しません。

使用しないでください。

+1

理由はどうか説明してください。 – artemave

+0

@artemave:それは 'タップ'の悪用だからです。 Tapはメソッドチェイン(したがって名前)をタップしたり、流体インターフェイスを維持したりするために設計されています。あなたのコードで 'tap'が使われる方法はDRYerでも普通の方法よりも簡潔ではありません。なぜあなたがそれをやっているのか分かりません - あなたのために' tap'を使っているようです。 'x = [];の何が問題なの? x << 1'または実際に '[] << 1'(本当に望むなら) – horseyguy

+1

' tap'イディオムは強力なオブジェクト構造です。ブロックをスコープし、結果を保持する一時変数を使用しないでください(たとえば、メソッドから結果のオブジェクトをすぐに返す場合は、後で必要としません)。私の例は実際にはそのために「タップ」を使用しますが、質問に付随するだけです。 – artemave

関連する問題