条件分岐の構文として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の要素を返すようにします。

みんな一度はこんなこと考えたんじゃないですかねー。でも、まあ..いらないですかね..


関連記事:

Rubyの条件分岐をメソッド化する


(追記:2014-4-19) k-shogoさんのコメントを受けて記述を一部訂正しました。

(追記:2014-4-19) acさんのコメントを受けて記述を一部訂正しました。



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS