Rubyのunless+ (|| or &&)文でバグったので、もう使わないと決めた話です。
こちらのコードを日本語にするとどうなるでしょうか?
unless hoge || fuga puts 'hoge' end
hogeがfalse または、fugaがfalseだったら、puts ‘hoge’するでしょうか。
答えはこちらです。
[13] pry(main)> puts 'hoge' unless true || true => nil [14] pry(main)> puts 'hoge' unless true || false => nil [15] pry(main)> puts 'hoge' unless false || false hoge => nil [16] pry(main)> puts 'hoge' unless false || true => nil
falseかつfalseのときに’hoge’が出力されます。
unlessで || or && を使用した場合は、この条件演算子も反転するんですね、、
考えれば当たり前のことなのですが、ifと同じ調子で読んでしまうとバグを埋め込んでしまいますね、、
はい、実際に埋め込んでました、、
なので、もうunless hoge && fugaや、unless hoge || fugaなんてコードは書きません。
伊藤さん、いつも素晴らしい記事ありがとうございます!
blog.jnito.com
コメントを残す