🐙
Ruby の右代入には戻り値が存在しない
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))
Discussion