Ruby で (字句ではなく) 動的なスコープ変数を使用することに興味があります。
let
Lispのように直接組み込みの方法はないようです。動的スコープ変数を実行する 1 つの可能な方法は、Christian Neukirchenによって提案されています。彼は自分のDynamic
クラスで「スレッド ローカル ハッシュ」を作成します。私はそれについてあまり夢中ではありませんでした。
tap
そこで、Ruby 1.9 にはメソッドがあることを思い出しました。tap
一連のコマンドでデバッグ値を出力するために使用している人をたくさん見かけます。動的スコープ変数を非常にうまく模倣するために使用できると思います。
以下は、動的スコープ変数を使用したい状況の例と、 を使用した解決策tap
です。
これを投稿するブログがあり、フィードバックがあれば、そこで投稿します。代わりに、私はこの考えに対する批判を求めて S/O に来ました。批評を投稿してください。賛成票が最も多いものに正しい答えを与えます。
状況
Account
、各アカウントを表す ActiveRecord オブジェクトがありますhas_many
Transaction
。ATransaction
には次の 2 つの属性があります。
description
amount
transactions
のすべての合計を見つけたいとaccount
考えていますが、 はまたは のamount
いずれかであることに注意してください (いいえ、それを批判することはできません)。nil
Float
最初のアイデアは次のとおりです。
def account_value
transactions.inject(0){|acum, t| acum += t.amount}
end
これは、最初にゼロの量を持っているときに爆撃します:
TypeError: nil can't be coerced into Fixnum
クリーン ソリューション
tap
を一時的に定義するために使用しますamount = 0
。transaction
値を 0 のままにして保存するのを忘れた場合に備えて、これを一時的なものにしたいだけです。
def account_value
transactions.inject(0){|acm, t| t.amount.tap{|amount| amount ||=0; acm+=amount}; acm}
end
の代入 to zero-if-nil はブロックamount
内にあるためtap
、 に戻すのを忘れる心配はありませんnil
。
あなたの考えは何ですか?