📌

Ruby の代入式の戻り値

2024/01/19に公開

Ruby では基本的に代入式の戻り値は右辺の値がそのまま返ってきます。

# 右辺の値が p の引数として渡される
p(a = 42)

まあ、それはそうですね。

メソッドを経由するとどうなる?

では、次のようにセッターや添字アクセスを使用した場合にどうなるでしょうか。

class X
  def []=(_, value)
    "hoge"
  end

  def value=(value)
    "foo"
  end
end

x = X.new

# なにが出力される?
p(x[:key] = 1)
p(x.value = 2)

パッと見、各メソッドの戻り値が返ってくるような気もしますが、この場合でも右辺の値が返ってきます。

# 出力結果
p(x[:key] = 1)   # => 1
p(x.value = 2)   # => 2

ただし、以下のような場合はメソッドの戻り値がそのまま返ってきます。

# これは #[]= の戻り値が返ってくる
p(x.[]=(:key, 1))   # => "hoge"

# こっちはその限りではない
p(x.value=(2))      # => 2

# #send メソッド使用した場合も両方ともメソッドの戻り値がそのまま返ってくる
p(x.send(:[]=, :key, 1))   # => "hoge"
p(x.send(:value=, 2))      # => "foo"

それはそうな挙動ですが知らないと面白いですねー。

GitHubで編集を提案

Discussion