[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つに分かれています。ではどうぞ。