読者です 読者をやめる 読者になる 読者になる

Ruby 2つの値の大小比較をする

Ruby

Mathモジュールに2つの値を比較するメソッドあるかな??って探してみたけど見つからない。
java だとMathクラスにmaxメソッドがあって比較ができる。
Rubyにもmaxメソッドはあるんだけど、配列中の最大値を取ってくるみたい。こっちのほうがはるかに便利^^;

###2つの値の大小比較###########

a = 1
b = 5
#三項演算子で大小比較
num = (a > b) ? x : y   #=> num = 5

よくよく考えれば一行で終わる処理なんだから標準ライブラリに頼らなくてもいい。
(でも頼っちゃう!悔しい!(・∀・))
何度も使うようであれば自分でメソッド定義してあげればいいかな

#引数の2つの値を比較して大きい方を返す
def larger(a, b)
  return (a > b) ? a : b
end

num1 = 5
num2 = 5

num = larger(num1, num2)   #=> num = 5

メソッド名はmaxでもいいんだけど、
最大値を返すというよりかは、大きい方を返すのでlargerとかbiggerとか??


追記
Mathモジュールに追加して使うのもいいかも??
RubyのMathにこういうメソッドを追加するのが正しいのかどうかはわかりませんが。。笑

module Math
  #引数の2つの値を比較して大きい方を返す
  def self.larger(a, b)
    return (a > b) ? a : b
  end
end

num1 = 5
num2 = 5

#Mathモジュールのメソッド呼び出しで使えるようになる!
num = Math.larger(num1, num2)   #=> num = 5

ちなみに、rubyのmaxメソッドは配列で使える。
配列中の数値の中で一番大きい値を返してくれる。これぞmax。まっくす(^O^)

nums = [4, 20, 5, 60, 100, 2]
max_num = nums.max   #=> max_num = 100

独自のルールで比較をしたい場合はmaxメソッドにブロックを渡す。

#数値が文字列で困ってる(´・ω・`)
nums = ["4", "20", "5", "60", "100", "2"]
#max_num = nums.max  #=> 文字列は比較不可。例外が発生する

max_num = nums.max{|a, b|
  a.to_i <=> b.to_i
}
p max_num  #=> "100"

配列中に文字列が入ってる場合は例外が発生する。
maxメソッドの内部では 宇宙船演算子<=> を使って比較しているため文字列は比較できないため。
なので、要素を数値型に変換してから比較して最大値を返すようにしている。
ただ、返ってくる値は変換前の値みたい。