プログラムにおいて文字列と並んで大事なものは「数値」です。Rubyのプログラムではこの数値を何気なく使ってしまいますが、実は非常に奥深いものです。
また数値に関する多数のメソッドを使い、効率的に実装することも可能です。特に、数値に直接ドットとメソッド名をつなげて処理を書けるというのは、Rubyの世界ではすべてオブジェクトというのを実感できる使い方です。
この記事では、数値の基本と各種メソッド(一例としてtimesメソッド)について解説します。
数値とは何か
Rubyでは、数値ですらオブジェクト
数値とは?と聞かれても困るくらい、普通に使うものです。
ここでは数学的な意味ではなく、Rubyの仕組みの中での位置付けを探ります。
Rubyではすべてのモノが例外なくオブジェクトです。何らかのクラスを元に生成されたインスタンスだけではありません。
数値や文字列といった、他言語ではプリミティブ型と呼ばれているモノですら、Rubyの世界ではオブジェクトです。
他言語、例えばJavaの世界では数値はプリミティブ型と呼ばれる、いわゆる「オブジェクトではない原始的なモノ」です。オブジェクトとして扱いたいときは、Integerクラスというラッパークラスを使います。
Java以外でも一般的に開発言語においては、数値とオブジェクトは別扱いになります。
ところが、Rubyでは数値ですらオブジェクトなので、数値.メソッドという記述がありえます。
数値に関連するクラス
数値によって、どのクラスに属するのか変わります。以下は、数値に関するクラスの仲間たちです。
Numeric -+-- Integer -+-- Fixnum (整数) | | | +-- Bignum (整数かつ大きな整数) | +-- Rational(有理数) | +-- Float (浮動小数点数) | +-- Complex(複素数)
どのクラスに属しているか
数値がどのクラスに属しているかを調べるには、classメソッドを使います。
puts 5.class() puts 3.14.class() puts (1 + 3i).class()
[実行結果]
Integer Float Complex
数値がいずれかのクラスに属していることがお分かりいただけたと思います。余談ですが、複素数ですら普通に表現できるところが、Rubyのすごいところです。
数値と文字の変換
Rubyにおいて、数値から文字列、文字列から数値の変換は、とても簡単です。
p 3.to_s p "3".to_i
[実行結果]
"3" 3
相互に変換できたことが分かりました。
数値を扱う演算子
数値を扱う演算子を解説します。
他の言語と変わらない四則演算、つまり加算(+)減算(-)、乗算(*)、除算(/)と剰余(%)は省略します。
それ以外に1つ、Rubyらしい演算子を解説します。
多重代入
複数の変数に、一気に代入する方法があります。多重代入です。
x, y, z = 3, 1, 2 puts x puts y puts z
[実行結果]
3 1 2
3つの変数に、一気に数値を代入することができました。Ruby独特の方法です。とても便利ですね。
Rubyにもやっぱりあった自己代入
開発言語でおなじみの自己代入もあります。
sum = 0 for i in 1..5 do sum += i end puts sum
[実行結果]
15
「sum += i」は「sum = sum + i」と同じ意味です。
Rubyにはインクリメントがない!
残念なことに、Rubyにはインクリメントがありません。
「i ++ 」といったおなじみの実装はできません。「i += 1」とする必要があります。
数値に関連する便利なメソッド
ここでは、Rubyの数値に関するメソッドを解説します。
超便利!繰り返しで使うtimesメソッド
5回、同じ数値を表示させたいときはtimesメソッドを使います。数値ドットtimesで記述します。
5.times do |i| puts i end
5回数値を表示させることができました。
他の言語では、「インスタンス.メソッド名()」の形式でメソッドを実行します。上記のプログラムは、数値がオブジェクトと同じ扱いであることを如実に物語っています。
奇数か偶数か
奇数か偶数かを判断するには、even?またはodd?を使います。
puts 3.even? puts 3.odd?
[実行結果]
false true
英語で偶数?奇数?と聞いているようで、直感的で分かりやすいですね。また「数値 % 2 == 0」で偶数かどうかを判断させる方法もできますが、こちらの方が語りかけるようで分かりやすいです。
プラスかマイナスか
プラス、またはマイナスを判断するメソッドがあります。negative?とpositive?です。
plus = 3 minus = -3 puts plus.negative? puts plus.positive? puts minus.negative? puts minus.positive?
[実行結果]
false true true false
0以上か以下か、不等号の演算子で評価することも可能ですが、先ほどの例と同じく語りかけるようで分かりやすいです。
ゼロかどうか
比較演算子で==0とやっても良いのですが、これも一応メソッドがあります。zero?です
num = 0 puts num.zero?
[実行結果]
true
if文でこれを使うと、見た目上分かりやすいです。
num = 0 if num.zero? puts "ゼロです" else puts "ゼロではありません" end
ゼロかどうかをzero?と聞いているようで、面白いですね。
特殊な演算子 <=>
Rubyには、<=>という珍しい比較演算子があります。
例えばaとbという2つの変数があり、演算子で比較すると、以下の結果を返します。
a < b の場合は -1 a = b の場合は 0 a > b の場合は 1
実際に見てみましょう。
a = 3 b = 2 puts a <=> b
[実行結果]
1
a > b なので1が返ってきました。
まとめ
本記事では、Rubyにおける数値の扱いの基本を解説しました。
数値を自在に扱うには、本記事の内容だけではまだまだ知識がたりません。数値の応用編の記事も参考にしてくださいね!