Ruby基礎復習(3) Numericクラス
パーフェクトRuby p.144より。
判定系メソッド、#nonzero
が#zero
の真逆の動きではなくてちょっと混乱しそう。あと#integer?
はあるけど#float?
はないとか。
0.zero? # => true
3.zero? # => false
0.nonzero? # => nil
1.nonzero? # => 1
1.integer? # => true
1.real? # => true
演算子系の話は割愛するが、宇宙船演算子だけ注意しとく。右辺(引数)の方が大きければ負。左辺(レシーバ)が大きければ正。#sort
ではブロック内の戻り値が負の場合は2要素をそのまま、正の場合は逆順にして返してくる。宇宙船演算子を利用して昇順or降順に並べ替えることができる。
1 <=> 2 # => -1
2 <=> 1 # => 1
1 <=> 1 # => 0
%w(aaaa aa aaa).sort { |a,b|
a.length <=> b.length
} # => ["aa", "aaa", "aaaa"]
丸め。#round
が四捨五入。#ceil
で切り上げ。#floor
で切り捨て。馴染みのない英単語で覚えにくい。
1.4.round # => 1
1.4.ceil # => 2
1.4.floor # => 1
#step
で、第一引数に与えられた上限数値に達するまで、レシーバに第二引数の数値を足し合わせていく繰り返し処理がつくれる。第二引数のデフォルトは1。整数であれば#upto
と#downto
で1ずつ加算、減算させていくことも可能。
2.step 4 do |i|
puts i
end # "2","3","4"
2.step 3, 0.3 do |num|
puts num
end # "2.0","2.3","2.6","2.9"
2.upto 5 do |i|
puts i
end # 2,3,4,5
4.downto 2 do |i|
puts i
end # 4,3,2
整数
Integerクラスは絶対値の大きさによりFixnumサブクラスとBignumサブクラスに振り分けられる。メモリ領域との関係で境界が定められるみたいだが、自動判定されるのであまり気にしなくても良い気がする。整数ならではのメソッドは以下のあたり。oddとevenは「オッドアイ」の意味を考えると連想できることに気付いた。
1.odd? # => true
1.even? # => false
1.next # => 2
2.succ # => 3
3.pred # => 2
56.chr # => "8" 文字コードで対応する文字列を返す
"123".to_i # => 123
浮動小数点数
Floatクラス。あまり意識せずに使っても勝手にFloatクラス扱いしてくれたりするので楽。
num = 2.0 / 2
num.class # => Float
有理数無理数
Rationalが有理数クラスなわけだが、プログラミングにおいて無理数有理数の別が必要になる場面が想定できない数学オンチなのでよくわからん。Ruby Silverにも出なかった気がするし割愛でいっかな。。。なお複素数は文字通りComplexクラス。