要素代入演算子式に関する落とし穴

Ruby の要素代入演算子(演算子でいいのかな?)は定義が可能です。

class A
  def x=(a)
    return 1
  end
end

上の定義は A.new.x = y の形で y の値にかかわらず常に 1 を返すように意図したつもりですが、実際には上手くいきません。

A.new.x = 5 #=> 5
A.new.x = 100 #=> 100

つまり、y の値が返されます。これは 1.8, 1.9 に共通した振舞いです。私はこれまで要素代入演算子式はただの糖衣構文だと思い込んでいたのですが、実は return された値を見ないという特徴があるようです。私と同様の思い込みをしている人は注意しておいて下さい。

このせいで Selfish は (_(:x => nil).x = 10).x のように書けないんですよね。一方 Self においてはスロットの割り当ては self を返すので ((|x <- nil|) x: 10) x のように書くことが出来ます。