chroju.dev/blog

the world as code

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クラス。