18 April 2014
Rubyの条件分岐をもっと簡潔に
条件分岐の構文としてRubyには「if-else」があります。
animal = 'hippopotamus'
if animal.size > 10
puts "You must be an idiot!"
else
puts "You are good in size."
end
# >> You must be an idiot!
しかし、たかがメッセージの出力にこんなに行数を消費したくはない、と思うのが平均的なRubyistの思考です。そしてRuby唯一の三項演算子を使います。
puts animal.size > 10 ? "You must be an idiot!" : "You are good in size."
# >> You must be an idiot!
短くなりましたが、もう一つ問題があります。それは、手続きブロックとしての結合優先順位が低いということです。
puts (animal.size > 10 ? "You must be an idiot!" : "You are good in size.").upcase
# >> YOU MUST BE AN IDIOT!
puts begin
if animal.size > 10
"You must be an idiot!"
else
"You are good in size."
end
end.upcase
# >> YOU MUST BE AN IDIOT!
このようにその返り値をputsする場合、括弧やbegin-endで括るか一時変数に代入する必要があります。
そんなわけで…
こんなのどうですか?
module CoreExt
refine Array do
def [](*args)
if args.size == 1 &&
[true, false, nil].any? { |e| e == args.first }
super( args.first ? 0 : 1 )
else
super
end
end
end
end
using CoreExt
animal = 'hippopotamus'
puts ["You must be an idiot!", "You are good in size."][animal.size > 10].upcase
# >> YOU MUST BE AN IDIOT!
result = false
%w(success fail)[result] # => "fail"
つまりArray#[]を弄って、引数にtrueが渡されたらindex 0の要素を返し、falseなら1の要素を返すようにします。
みんな一度はこんなこと考えたんじゃないですかねー。でも、まあ..いらないですかね..
関連記事:
(追記:2014-4-19) k-shogoさんのコメントを受けて記述を一部訂正しました。
(追記:2014-4-19) acさんのコメントを受けて記述を一部訂正しました。
blog comments powered by Disqus