🐙

Ruby の右代入には戻り値が存在しない

2024/01/29に公開

Ruby のほとんどの構文は式なので戻り値があります。

# if 文も式なので戻り値がある
a = if cond
      "OK"
    else
      "NG"
    end

# def にも戻り値がある
name = def hoge
end

しかし、右代入では戻り値が void なので代入式で値を受け取ったり if 文の条件式に利用する事はできません。

# error: void value expression (SyntaxError)
x = (42 => a)
# error: void value expression (SyntaxError)
if 42 => a
end

void なんて普段 Ruby を書いてるときにはまず目にしませんよね。
ちなみに以下のようにメソッドの引数に書いた場合はシンタックスエラーにはなりません。

p(42 => a)

これは 42 => a が右代入ではなくて Hash リテラルとして認識されるためですね。

a = "a"

p(42 => a)
# => {42=>"a"}

これは上のような書き方が右代入が実装される前から動作する書き方なので互換性のためこうなっています。
逆に言うと以下のように () を書くと void でエラーになります。

# error: void value expression (SyntaxError)
p((42 => a))
GitHubで編集を提案

Discussion