«前の日記(2005年11月22日) 最新 次の日記(2005年11月24日)» 編集

Matzにっき


2005年11月23日 勤労感謝の日 [長年日記]

_ 感染/結婚記念日

朝、ふと見ると、次女のほっぺたが膨らんでいる。あらら。

今日は結婚記念日(14年目)なので、なにかしようかと思ったが、 病人がいるのでは仕方がなくおとなしくしていることにする。

実家には妹が戻ってきているので、会いに行きたかったのだが、 おたふく風邪を蔓延させてもいかんしなあ。

_ [Ruby] assignment in modifier

たとえば

foo(x) if x = bar()

のようなコードではxへの代入がfoo(x)での参照よりも後ろに来ているので、 前のxはメソッド呼び出しとして解釈されてしまう。 [ruby-core:06684]では、上記のコードを

if x = bar()
  foo(x)
end

と完全に同一にすることが提案されている。

が、正直あんまり乗り気じゃない。

ま、実装が面倒くさい(2パスかバックパッチングが必要になる)というのが最大の理由だが、 そのような面倒な処理を行って発生する違いというのは

  • 条件式での代入という副作用があり、それほど推奨できない行為を許可すること
  • modifer(後置ifなど)の説明がちょっぴり簡単になる

くらいだから。それに結局

loop do
  p a
  a = 5
end

とか

if false
  a = 5
end
p a

のようなコードで発生する「実際の代入処理の実行(動的)と代入文によるローカル変数の宣言(静的)」の問題がすべて解決するわけでない以上、あんまり嬉しくないのではないだろうか。

ここで、(どうせ2パスにするなら)もう一歩進めて、「そのメソッド内で代入の左辺に登場する識別子はどこでもローカル変数とみなす」というルールを導入することが考えられる。これなら、上にあげたloopやifのものにも対応できる。

しかし、このルールには、ある識別子がローカル変数かどうかメソッド全体を見ないとわからないので、 コードの理解しやすさが下がる危険性がある。メソッドが小さい時はいいけど、大きなメソッドがないとは限らないし。まあ、(かっこを省略した)無引数メソッド呼び出しと同名のローカル変数が共存するときにしか、問題にならないので、気にすることはないのかもしれないけど。


«前の日記(2005年11月22日) 最新 次の日記(2005年11月24日)» 編集