soukouki’s diary

誰かの役に立つ記事をかけたらいいなあ

Rubyでの実行されない宣言

((false)? a=123 : nil)

この後のaの値が気になる。

実際にやってみた。

irb(main):001:0> ((false)? a=123 : nil)
=> nil
irb(main):002:0> a
=> nil

nilが代入されていた。

それならifはどうなるのか、

irb(main):003:0> if(false); b=123; end
=> nil
irb(main):004:0> b
=> nil

これもnilが代入されていた。

もうひとつ

irb(main):001:0> a=123 if false
=> nil
irb(main):002:0> a
=> nil

これを使って、

def f(a, b)
    ((!a.nil?)? (a_is_not_nil = true; a) : "")+
    ((!b.nil?)? ((a_is_not_nil)? ", " : "")+b : "")
end

p f("a", "b")
p f("a", nil)
p f(nil, "b")
p f(nil, nil)
"a, b"
"a"
"b"
""

こんな風にできる。

リファレンスを見てみる

宣言は、例え実行されなくても宣言とみなされます。

v = 1 if false # 代入は行われないが宣言は有効
p defined?(v)  # => "local-variable"
p v            # => nil