Rubyのsetterの戻り値がキモい件

※正確には、setterじゃなくて、代入でsetterが使用される場合の戻り値がキモい。というお話。

class Test
  def value= value
    "value"
  end
end

t = Test.new
p (t.value = 10)           #=> 10
p (t.value=(10))           #=> 10
p (t.__send__ :value=, 10) #=> "value"

うん、まあわかるんだけどね。利便性もそのほうが高いし、多分、二番目は

t.value = (10)

として解釈されてるんだろうし。でもなんとなくキモい。

発端

class Test
  attr_reader :value
  
  def value= value
    @value = value
    "value"
  end
end

t1 = Test.new
t2 = Test.new
t1.value = t2.value = 10

p t1.value #=> 10
p t2.value #=> 10

え、これって

t1.value = (t2.value = 10)

じゃなくて

t1.value = 10
t2.value = 10

として解釈されてんの? おかしくね?


と思って調べてみますた。
多分、解釈は前者でいいんだけど戻り値が不思議だっただけかと思われます。