こんにちは、かつコーチです。
「変数に型を書かなくていいって聞いたけど、それで本当に大丈夫なの?」。
他の言語に触れたことがある方ほど、Rubyの変数まわりの自由さに不安を感じるかもしれません。
この記事では、Rubyの変数宣言の考え方と、代表的なデータ型を初心者向けに解説します。
特に他の言語にはあまりないシンボルという概念についても、丁寧に説明します。
変数とは?
型宣言が不要なRuby
変数とは、値に名前をつけて後から使い回せるようにする仕組みのことです。
Rubyでは、変数を使う前に型を宣言する必要がありません。
いきなり=で値を代入するだけで、変数を作ることができます。
name = "かつコーチ"
age = 30
puts name
# => かつコーチ
puts age
# => 30
JavaのようにあらかじめString型やInteger型を宣言する言語に慣れていると、この自由さに驚くかもしれません。
Rubyでは、代入された値によって変数の型が自動的に決まります。
このような性質を動的型付けと呼びます。
同じ変数に別の型を再代入できる
動的型付けの特徴として、同じ変数に異なる型の値を入れ直すこともできます。
value = 100
puts value.class
# => Integer
value = "百"
puts value.class
# => String
自由度が高い反面、大規模な開発では意図しない型の混在がバグの原因になることもあります。
初心者のうちは、1つの変数には1種類の役割・型を持たせることを意識すると、コードが読みやすくなります。
主要なデータ型
Rubyには、値の種類ごとに複数のデータ型(クラス)が用意されています。
それぞれの値がどの型(クラス)に属しているかは、.classメソッドで確認できます。
Integer(整数)とFloat(浮動小数点数)
整数はInteger型、小数はFloat型として扱われます。
puts 10.class
# => Integer
puts 3.14.class
# => Float
puts (10 / 3)
# => 3(Integer同士の割り算は切り捨てられる)
puts (10.0 / 3)
# => 3.3333333333333335(片方がFloatなら結果もFloat)
整数同士の割り算は小数点以下が切り捨てられる点に注意が必要です。
小数の結果が欲しい場合は、どちらかをFloatにする必要があります。
String(文字列)
文字を扱う型がStringです。
シングルクォート(')とダブルクォート(")のどちらでも作成できますが、挙動に違いがあります。
name = "かつコーチ"
# ダブルクォートは式展開ができる
puts "こんにちは、#{name}さん"
# => こんにちは、かつコーチさん
# シングルクォートは式展開ができない
puts 'こんにちは、#{name}さん'
# => こんにちは、#{name}さん
#{}で変数の値を文字列に埋め込むことを式展開と呼びます。
式展開を使いたい場合は、必ずダブルクォートを使う必要があります。
Symbol(シンボル)
Symbol(シンボル)は、他のプログラミング言語ではあまり見かけない、Ruby特有のデータ型です。
先頭にコロン(:)をつけて表現します。
status = :active
puts status.class
# => Symbol
シンボルは、見た目こそ文字列に似ていますが、大きな違いがあります。
文字列は同じ内容でも作成のたびに別の実体として扱われますが、シンボルは同じ名前であれば、プログラム内でただ1つの実体を共有します。
そのため、文字列よりもメモリ効率がよく、比較処理が高速になるという特徴があります。
シンボルは主に、ハッシュのキーや、状態を表すラベルのような用途で使われます。
user = { name: "かつコーチ", role: :admin }
puts user[:role]
# => admin
「変わらない意味・ラベルを表したいときはシンボル、実際の文章や可変のテキストを扱いたいときは文字列」というのが基本的な使い分けの考え方です。
私自身、初心者の頃は文字列とシンボルの違いがわからず、ハッシュのキーを"name"で定義したのにuser[:name]で参照してしまい、nilが返ってきて原因を探した経験があります。
Boolean(true / false)とnil
真偽値はtrueとfalseの2つの値で表されます。
Rubyには専用のBoolean型はなく、trueはTrueClass、falseはFalseClassというそれぞれ別のクラスに属しています。
puts true.class
# => TrueClass
puts false.class
# => FalseClass
そして、Rubyには「値が存在しない」ことを表す特別な値としてnil(にる)があります。nilはNilClassというクラスに属する値です。
value = nil
puts value.class
# => NilClass
よくあるつまずきポイント・エラー対処
シンボルと文字列を混同してハッシュの値が取れない
❌Before(うまくいかない例)
user = { name: "かつコーチ" }
puts user["name"]
# => nil
私が実際にハマったのがこのパターンです。{ name: "かつコーチ" }という書き方は、実は{ :name => "かつコーチ" }の省略形であり、キーはシンボルの:nameです。
文字列の"name"とシンボルの:nameは別物として扱われるため、user["name"]ではキーが一致せずnilが返ってきます。
✅After(解決した書き方)
user = { name: "かつコーチ" }
puts user[:name]
# => かつコーチ
キーをシンボルの:nameで参照することで、正しく値を取り出せます。
「ハッシュから値を取り出せずnilが返る」というときは、キーの型(文字列かシンボルか)が一致しているかをまず疑うとよいでしょう。
まとめ
この記事のポイント
- Rubyの変数は型宣言が不要で、代入した値によって型が自動的に決まる(動的型付け)
- 数値はInteger・Float、文字はString、真偽値はTrueClass・FalseClass、未定義はNilClassとして扱われる
- SymbolはRuby特有のデータ型で、同じ名前を効率よく共有できるため、ハッシュのキーなどに使われる
- ハッシュの値が取れないときは、キーが文字列かシンボルかの不一致を疑う
次に読むべき記事
データ型の基本がわかったら、次は文字列や配列といった具体的なデータの操作方法を見ていきましょう。
「文字列操作の基本(メソッドチェーンで書く)」で、Stringの扱い方をさらに深めてみてください。
タグ: Ruby, 初心者向け, 基本文法