💡 この記事でわかること
- データ型とは何か、なぜ意識する必要があるのか
- 文字列(String)・整数(Integer)・小数(Float)・真偽値(true/false)・nilの違い
- class メソッドで値の型を調べる方法
- to_s・to_i・to_fによる型変換
- getsで受け取った値が文字列になる注意点
1. データ型とは?
データ型とは、
👉 プログラムが扱う値の「種類」のことです。「文字列」「整数」「小数」「真偽値」などの種類があり、種類によってできる操作が変わります。
💡 Rubyでは変数を作るときに型を宣言しませんが、値そのものには必ず型があります。前回の記事で触れたとおり、Rubyは「すべてがオブジェクト」なので、数値や文字列などの型はすべてクラスとして実装されています。
puts 1 + 2 # 3(数値の足し算)
puts "1" + "2" # 12(文字列の連結)puts・変数の基本をまだ確認していない場合は、先にこちらを読んでおくとスムーズです。
👉 Rubyの基本文法(puts・変数・式展開)についての記事はこちら
2. 文字列型(String)
文字列は文字の並びを表す型です。シングルクォート'かダブルクォート"で囲みます。
name = "太郎"
puts name + "さん" # 太郎さん(+ で連結)
puts "=" * 10 # ==========(* で繰り返し)
puts name.length # 2(文字数)
message = "こんにちは"
message << "、太郎さん" # << で末尾に追加(元の文字列そのものを書き換える)
puts message # こんにちは、太郎さん👉 連結は+、繰り返しは*、文字数は.lengthで取得できます。数字であっても、クォートで囲めば文字列として扱われます("100"は数値の100ではありません)。
💡 ダブルクォートとシングルクォートには違いがあります。ダブルクォートの中では#{}による式展開や\nなどの改行文字が使えますが、シングルクォートの中ではそのままの文字として扱われます。
name = "太郎"
puts "こんにちは\n#{name}さん" # 改行してから「太郎さん」
puts 'こんにちは\n#{name}さん' # そのまま \n#{name}さん と表示される3. 数値型(Integer・Float)
- Integer(整数):
10、-3、0など、小数点のない数 - Float(小数):
3.14、0.5、-1.0など、小数点のある数
a = 7
b = 2
puts a + b # 9
puts a - b # 5
puts a * b # 14
puts a / b # 3 ← Integer同士の割り算は切り捨てのInteger
puts a % b # 1 ← 余り
puts a ** b # 49 ← 7の2乗
puts a.fdiv(b) # 3.5 ← 小数まで欲しいときはfdiv👉 ここはPHP・Pythonとの違いに注意が必要なポイントです。Rubyでは、Integer同士の/は割り切れなくても切り捨てのInteger(小数点以下を切り捨てた整数)になります(7 / 2は3)。小数まで求めたいときは、片方をFloatにするか.fdivを使います。
puts 7 / 2 # 3
puts 7.0 / 2 # 3.5(片方をFloatにする)
puts 7 / 2.0 # 3.5
puts 7.fdiv(2) # 3.5💡 Floatの計算では、0.1 + 0.2が0.3ちょうどにならず、わずかな誤差が出ることがあります。コンピューターが小数を2進数で扱う都合によるもので、Rubyに限らず多くの言語で起こります。金額の計算など厳密さが必要な場面では注意してください。
4. 真偽値(true / false)とnil
true(真)・false(偽)は、条件判定の結果を表す値です。
puts 3 > 1 # true
puts 10 == 5 # falseRubyには、これに加えてnilという特別な値があります。「値が存在しないこと」を表し、PHPのnullやPythonのNoneにあたります。
👉 if文などの条件判定で「偽」として扱われるのは、falseとnilの2つだけです。PHPやJavaScript、Pythonでは0や空文字""、空配列[]も偽として扱われることがありますが、Rubyではこれらすべて「真」として扱われます。他の言語の経験がある方ほど間違えやすいポイントです。
puts "0は真として扱われる" if 0 # 出力される
puts "空文字も真として扱われる" if "" # 出力される
puts "nilは偽として扱われる" if nil # 出力されない5. 型を調べる:classメソッド
値の型を調べるには、値そのものに.classを付けます。PHPのgettype()やPythonのtype()のような「関数に値を渡す」形ではなく、値自身に問いかける書き方になっているのがRubyらしいところです。
puts "太郎".class # String
puts 20.class # Integer
puts 3.14.class # Float
puts true.class # TrueClass
puts nil.class # NilClass
puts "100".class # String ← クォートで囲むと文字列💡 trueとfalseはそれぞれ別のクラス(TrueClass・FalseClass)になっている点もRubyらしい設計です。「すべてがオブジェクト」という考え方が、こうした型の仕組みにも表れています。
6. 型変換:to_s / to_i / to_f
ある型の値を別の型に変換することを型変換と呼びます。Rubyでは、変換したい型に応じたメソッドを値に付けて呼び出します。
.to_s:文字列に変換する.to_i:整数に変換する.to_f:小数に変換する
price = "500"
puts price.to_i + 100 # 600(文字列を整数にしてから計算)
count = 3
puts "残り" + count.to_s + "個" # 残り3個(数値を文字列にしてから連結)
puts "1.5".to_f * 2 # 3.0👉 文字列と数値はそのまま+できません。"残り" + 3のように書くとTypeErrorになります。数値を文字列に混ぜるときは.to_sで変換するか、後述の#{}による式展開を使います。
💡 Rubyは、数値として解釈できない文字列に.to_iしてもエラーにならず、0や途中までの数値になります(PHPの(int)と同じ挙動で、エラーになるPythonのint()とは異なります)。
puts "abc".to_i # 0
puts "12個".to_i # 127. getsで受け取った値も文字列
キーボードからの入力を受け取るgetsは、入力された内容を必ず文字列(String)として返します。PHPの$_POSTやPythonのinput()と同じ注意点です。
age = gets
puts age + 1 # TypeError! ageは文字列なので数値を足せない数値として計算したい場合は.to_iで変換します。また、getsは入力の末尾に改行(Enterキーの分)が含まれるため、.chompで取り除くのが定番の書き方です。
age = gets.chomp.to_i
puts age + 1 # 入力が20なら 21👉 .chompで改行を取り除いてから.to_iで数値に変換する、という並びをセットで覚えておくと安心です。メソッドをドットでつなげて書けるのもRubyらしい特徴です。
8. #{}で変数を埋め込む(復習)
前回の記事でも紹介した#{}による式展開は、型変換の場面でも威力を発揮します。
name = "太郎"
age = 20
puts "#{name}さんは#{age}歳です" # 太郎さんは20歳です👉 #{}を使うと、数値でも.to_sで変換せずにそのまま埋め込めます。"名前" + age.to_s + "歳"のように+でつなぐより読みやすく、書き間違いも減るため、実際のコードでは式展開がよく使われます。
9. データ型 早見表
| 型 | class の表示 | 例 | 主な用途 |
|---|---|---|---|
| 文字列 | String | "太郎"、'Ruby' | 文字・テキスト |
| 整数 | Integer | 10、-3、0 | 個数・回数・年齢 |
| 小数 | Float | 3.14、0.5 | 割合・平均・測定値 |
| 真偽値 | TrueClass / FalseClass | true、false | 条件判定 |
| 値なし | NilClass | nil | 値が存在しないことを表す |
10. まとめ
- 主な型はString・Integer・Float・true/false、加えて値なしを表すnil
- 型は
.classで調べられる(値自身に問いかける書き方) - 変換は
.to_s・.to_i・.to_f。.to_iはエラーにならず0になる点に注意 - Integer同士の
/は切り捨てのIntegerになる(小数がほしいときは.fdivやFloat変換) - 偽として扱われるのは
falseとnilだけ(0や""は真) getsの返り値は文字列。.chomp.to_iで改行除去+数値変換するのが定番
👉 「偽になるのはfalseとnilだけ」「Integer同士の割り算は切り捨て」の2つは、他言語の経験がある人ほど間違えやすいポイントです。実際に.classで型を確認しながら、小さなコードを書いて慣れていきましょう。