天泣記

2017-08-31 (Thu)

#1 右代入

今日は Ruby 開発者会議があって、すこし右代入について matz と話した。 ふつうの代入が変数を左に書く「var = expr」という形なのに対して、 右代入は変数を右に書く「expr 右代入記号 var」 というようなものである。

これの意図は、method chain とかで処理が左から右に流れていく時に、 最後の結果を変数に代入しようとしたときに代入は最後の処理なので右端に書きたい ということである。 (yield_self が使われる状況のいくらかは、右代入のほうが適切なのではないかと思っている。)

機能自体には matz も positive なのだが、問題はどんな記号を選ぶかである。 今日は、内部の式には許さないという制約をつけることにより => を使えるのではないかという話になったのだが、 後からよく考えると以下のように引数の最後に {} にくくらないハッシュを与える場合は 曖昧になってしまうことに気がついた。

ruby -e 'def f(h) p h end; v = 1; f :a => v'
{:a=>1}

いまは右代入がないので f({:a => v}) と解釈されるが、=> による 右代入を採用すると、f(:a) => v つまり v = f(:a) という解釈も可能で、 曖昧になってしまう。

しかし、将来的に {} でくくらないハッシュ引数は禁止する方向という話もある。 だから、禁止した後なら右代入に使えるかもしれない。


[latest]


田中哲