ひとり勉強会

ひとり楽しく勉強会

[YARV] 自己代入の注意点

a += 100

自己代入とは、上のように、自分と他の値の演算結果を、また自分に代入し直すような式のことをいいます。これは基本的には、

a = a + 100

と書き直したのと同じ意味です。実際、ほんとうに同じ意味になる場合はRuby構文解析器が、YARVに渡すより前に同じ意味の代入式に書き換えてくれてます。ただし、いくつかの場合ではこの書き換えではダメで、今日はそのダメな部分を扱います。

属性参照

expr.attr += 100
expr.attr = expr.attr + 100

この二つの文は、ちょっと意味が違います。前者ではオブジェクトを表す式 expr は1回だけ評価されますが、後者だと2回評価されます。変数への自己代入なら1回も2回もありませんが、属性参照の場合は expr に任意の式が来る可能性があるので、1回と2回で意味が変わってきてしまいます。

and, or

プログラミング言語 Ruby リファレンスマニュアル にあるように、演算子が && か || の場合、

1 op= 式2

# 式1 = 式1 op 式2 ではなく1 op (式1 = 式2)

みたいになります。どういうことかというと、式1の値によっては、代入が行われません。属性参照の場合は attr= メソッドが呼ばれないということになるので、意味が変わってきます。普通の変数への代入でも、無駄な操作が減るので、たぶん若干効率があがります。あとそもそも、+ や - のような演算子Rubyのメソッドですが、|| や && は特別な構文なので扱いが分かれざるを得ません。
この辺ふまえた上で、自己代入関連のノードは4つに分かれています。ではどうぞ。