「お前こんなことも知らずにRuby使ってたのwww」と多数の人に牧草ロールをプレゼントされてしまいそうな話ですが。
お題
ちょいとこんなコードをご覧ください。
dat = {
:va => 0.3,
:vb => 0.5,
:v1 => 1.0,
:v2 => 2.0,
:v3 => 3.0,
:v4 => 4.0,
:v5 => 5.0,
:total => 100.0
}
result = (
dat[:va] * 0.2
+ dat[:vb]
+ dat[:v1]
+ dat[:v2] * 2
+ dat[:v3] * 3
+ dat[:v4] * 4
+ dat[:v5] * 5
) / dat[:total]
さて、resultはいくつになるでしょう?
私は0.572あたりを期待していたのですが、Rubyインタプリタは0.25だとおっしゃいました。
なんでやー!
どうやら
+ dat[:vb]
+ dat[:v1]
+ dat[:v2] * 2
+ dat[:v3] * 3
+ dat[:v4] * 4
+ dat[:v5] * 5
これらは全部「単項+がついただけの値が順に並んでるだけ」と解釈されるのですね。
()の中身は最後に評価された + dat[:v5] * 5 となり、結果(+5.0 * 5) / 100.0ということになると。
result = (
dat[:v1] * 0.2 +
dat[:v2] +
dat[:v1] +
dat[:v2] * 2 +
dat[:v3] * 3 +
dat[:v4] * 4 +
dat[:v5] * 5
) / dat[:total]
これならちゃんと()内を足しこんでくれます。
……どうにも計算の結果がおかしいのでirbにコード流してみたら一行ずつ評価されて初めて気が付きましたとさorz
多分文法仕様とか見たら根拠が書いてあるんでしょうけど今は読む気力ないですすみません。