第1章①|今さら学ぶ「Ruby文法基礎(前編:変数・条件分岐・型の基本)」
📚 シリーズ目次はこちら → 「今さら学ぶ」シリーズ — はじめに
この章でわかること
- Rubyの変数は「箱」ではなく「ラベル」— 動的型付けの本当の意味
- 条件分岐(if / unless / case)の使い方と使い分け
- Symbol(シンボル)とString(文字列)の決定的な違い
- nil とは何か — Rails開発でエラーの最大原因を理解する
- 文字列操作と型変換の基本(式展開・to_i・to_s)
🏠 たとえ話で掴む「Ruby文法」
Rubyの文法を学ぶとき、よく「変数は箱です」と説明される。でも、この理解はちょっとだけ惜しい。
もっとしっくりくるたとえがある。 引っ越し先の部屋に荷物を並べていく場面 を思い浮かべてほしい。
- 変数 は、荷物に貼る 名前シール(ラベル)。「これは本棚」「これは食器棚」とラベルを貼って区別する
- 条件分岐 は、 仕分けルール。「壊れ物は右の棚」「本は左の棚」と条件で振り分ける
- Symbol は、 部屋のドアに貼るプレート。「寝室」「キッチン」のように、名前が変わることのない固定のラベル
- nil は、 空っぽの棚。ラベルは貼ってあるのに中身がない。ここに「取り出して」と頼むとエラーになる
📌 変数は「箱」ではなく「ラベル」
箱のたとえがズレている理由
「変数は箱」というたとえだと、「箱の中にデータが入っている」とイメージする。でもRubyでは、変数はデータそのものを持っていない。 データ(オブジェクト)はメモリ上に存在していて、変数はそこへの「名前シール」を貼っているだけ です。
# 変数は「ラベル」— 同じオブジェクトに2枚のラベルを貼れる
greeting = "こんにちは"
message = greeting # 同じ文字列オブジェクトにラベルを2枚貼った
message << "、世界!" # messageを変更すると…
puts greeting # => "こんにちは、世界!"(greetingも変わる!)
箱のたとえだと「別々の箱だから影響しないはず」と思いがちだが、実際には同じオブジェクトを指しているので、片方を変えるともう片方にも影響する。これがラベルのたとえがしっくりくる理由です。
変数と型 — 技術的な定義
Rubyにおける 変数 とは、オブジェクトへの 参照(ポインタ) に名前をつけたもの。変数自体はデータを持たず、メモリ上のオブジェクトを「指し示す」だけの存在です。
そしてRubyは 動的型付け の言語です。技術的には「変数に型の宣言が不要で、実行時にデータの型が決まる」という意味になります。ラベルのたとえでいうと、同じラベルを別のオブジェクトに貼り替えられるということです。
# 同じ変数に違う型のデータを代入できる
data = "文字列です" # String
data = 42 # Integer(ラベルを貼り替えた)
data = [1, 2, 3] # Array(また貼り替えた)
JavaやC言語のような 静的型付け の言語では、「この変数は文字列専用」と最初に決める必要がある。Rubyではその制約がないので、柔軟に書ける反面、「今この変数に何が入っているか」を意識する必要があります。
💡 「動的型付けだから型がない」わけではない。Rubyの全てのデータはオブジェクトであり、それぞれ
StringやIntegerといった クラス(型) を持っている。変数に型の宣言が不要なだけです(→ 第3章でクラスとオブジェクトの関係を詳しく扱います)。"こんにちは".class # => String 42.class # => Integer [1, 2, 3].class # => Array nil.class # => NilClass ← nilもオブジェクト!
🔀 条件分岐 — 「もし〜なら」で処理を振り分ける
なぜ条件分岐が重要か
条件分岐 は、条件に応じて実行する処理を切り替える仕組みです。Railsのコントローラで「保存に成功したらリダイレクト、失敗したらフォームを再表示」、バリデーションで「値が空ならエラー」、ビューで「ログイン中なら編集ボタンを表示」…と、 Railsのあらゆる場面で登場する。Rubyの文法の中でも最も頻出です。
if / elsif / else
# 基本の if / elsif / else
status = "published"
if status == "published"
puts "公開済みです"
elsif status == "draft"
puts "下書きです"
else
puts "不明なステータスです"
end
条件式が true になったブロックだけが実行される。elsif はいくつでも書けます。
Railsのコントローラでは、こんな形で毎回使われる。
# Railsのコントローラで毎回見る形
def create
@article = current_user.articles.build(article_params)
if @article.save # 保存が成功したら true、失敗したら false
redirect_to @article, notice: "記事を投稿しました"
else
render :new, status: :unprocessable_entity
end
end
後置 if — 1行で書く
条件がシンプルなときは、 後置 if で1行にまとめられる。
# 通常の書き方
if user.admin?
redirect_to admin_path
end
# 後置 if(Rubyらしい書き方)
redirect_to admin_path if user.admin?
後置 if は「〜する、もし〜なら」と英語の語順に近く、短い処理のときに読みやすい。Railsのコードでは非常によく見かけます。
unless — 「〜でなければ」
unless は if の反対で、「条件が false のとき」に実行される。
# unlessは「〜でなければ」
unless user.signed_in?
redirect_to login_path
end
# 後置 unless(よく使う)
redirect_to login_path unless user.signed_in?
⚠️
unlessにelsifをつけたり、条件を複雑にすると途端に読みにくくなる。unlessは シンプルな否定条件のときだけ 使い、複雑な条件には素直にif !条件やif+ 肯定条件を使うのが定石です。
case / when — 多分岐
case は、1つの値に対して複数のパターンを比較するときに使う。if/elsif を何段も重ねるより読みやすくなります。
# case文の基本
role = "editor"
case role
when "admin"
puts "管理者です。全機能にアクセスできます"
when "editor"
puts "編集者です。記事の編集ができます"
when "viewer"
puts "閲覧者です。記事の閲覧のみ可能です"
else
puts "不明な権限です"
end
Railsでは、ステータスの判定や権限の分岐など、取りうる値が決まっている場面で case をよく使います。
真偽値のルール — Rubyは他の言語と違う
条件分岐を正しく使うには、Rubyの 真偽値のルール を知っておく必要がある。
# Rubyで「偽(false)」と判定されるのは、この2つだけ
false # false自身
nil # nil
# それ以外はすべて「真(true)」
true # 当然 true
0 # ← 他の言語と違い、0は true!
"" # ← 空文字列も true!
[] # ← 空配列も true!
これはJavaScriptやPythonと大きく異なるポイントです。JavaScriptでは 0 や "" は偽(falsy)だが、Rubyでは真。 Rubyでは false と nil だけが偽、それ以外はすべて真。
🏷️ Symbol — 変わらない名前のラベル
なぜ :title のようにコロンがつくのか
Railsのコードを見ると、:title や :published のようにコロン(:)で始まる単語がたくさん出てくる。これが Symbol(シンボル) です。
# Railsのコードでは、Symbolがあちこちに登場する
validates :title, presence: true # :title, :presence
has_many :articles, dependent: :destroy # :articles, :dependent, :destroy
redirect_to articles_path, notice: "OK" # :notice
params[:id] # :id
Rails学習中に「なんとなくコロンをつけて書いていた」という人は多いと思う。ここで整理しておきます。
Symbolとは何か — 技術的な定義
Symbol とは、 名前を表すための軽量な不変オブジェクト です。
Stringが「変わるかもしれないテキストデータ」を扱うのに対し、Symbolは「プログラムの中で使う固定の識別子」を表す。冒頭のたとえでいう「部屋のドアプレート」です。「寝室」と書かれたプレートの文字が途中で変わることはない。
StringとSymbolの決定的な違い
技術的に最も重要な違いは、 同じ内容のオブジェクトがメモリ上に何個作られるか です。
# Stringは毎回新しいオブジェクトが作られる
"title".object_id # => 70123456789(ある番号)
"title".object_id # => 70123456790(違う番号!= 別のオブジェクト)
# Symbolは同じ内容なら必ず同じオブジェクト
:title.object_id # => 12345(ある番号)
:title.object_id # => 12345(同じ番号!= 同じオブジェクト)
Symbolは「同じ名前なら同じオブジェクト」が保証される。そのためStringより比較が高速で、メモリの消費も少ない。だからRailsでは、 ハッシュのキー や メソッドの引数名 など「固定のラベル」として、Symbolが標準的に使われています。
使い分けの基準
| 用途 | 使うもの | 理由 |
|---|---|---|
| ハッシュのキー | Symbol(:title) |
固定の識別子。変更されない |
| メソッドの引数名 | Symbol(dependent: :destroy) |
固定のオプション名 |
| ユーザーの入力値 | String("田中") |
ユーザーが入力するテキスト |
| 画面に表示する文章 | String("記事を投稿しました") |
変わりうるテキスト |
迷ったら「 変わらない名前 → Symbol、変わりうるデータ → String」で判断できます。
💡
{ title: "Ruby入門" }は{ :title => "Ruby入門" }の省略記法。キーがSymbolのとき、コロンを後ろに移動して=>を省略できる。Railsではこの省略記法が標準です。
🕳️ nil — 「何もない」を表すオブジェクト
nilとは何か
nil は、Rubyにおいて「値が存在しない」ことを表すオブジェクトです。他の言語の null(Java)や None(Python)に相当します。
nilが登場する場面は非常に多く、 Rails開発でエラーの最大の原因 でもある。
# nilが発生する典型的な場面
user = User.find_by(email: "存在しない@example.com") # => nil(見つからなかった)
array = [1, 2, 3]
array[10] # => nil(範囲外のアクセス)
hash = { name: "田中" }
hash[:age] # => nil(存在しないキー)
なぜnilが問題になるか
nilが怖いのは、 nilに対してメソッドを呼ぶとエラーになる からです。
user = User.find_by(email: "存在しない@example.com") # => nil
user.name # => NoMethodError: undefined method 'name' for nil:NilClass
このエラーはRails開発で最もよく見かけるもの。「nil に対して name を呼んだ」— つまり「ユーザーが見つからなかったのに、見つかった前提でメソッドを呼んでしまった」ということ。第0章でエラーの切り分け方を整理したが、その原因のほとんどがこの nil です(→ 第23章でデバッグ方法を詳しく扱います)。
nilを安全に扱う方法
Rubyには、nilを安全に扱うためのメソッドや演算子がいくつも用意されています。
user = User.find_by(email: "存在しない@example.com") # => nil
# ① nil? で確認する
if user.nil?
puts "ユーザーが見つかりません"
else
puts user.name
end
# ② &.(ぼっち演算子 / safe navigation operator)
# nilでなければメソッドを呼ぶ。nilならnilを返す(エラーにならない!)
user&.name # => nil
# ③ || でデフォルト値を設定する
display_name = user&.name || "名無しさん"
# user がnil → user&.name もnil → || の右側の "名無しさん" が使われる
&.(ぼっち演算子) は特に重要です。正式名称は safe navigation operator(安全なメソッド呼び出し演算子) で、「nilかもしれないオブジェクトに対してメソッドを呼ぶ」場面で使う。Railsのビューやコントローラで頻繁に見かけます。
# Railsでの &. の使用例
<%= @article.user&.name || "退会済みユーザー" %>
Railsで使う nil チェック系メソッド
Railsでは、nilチェックをさらに便利にするメソッドが追加されています。
# .nil? — nilかどうか(Ruby標準)
nil.nil? # => true
"".nil? # => false
0.nil? # => false
# .present? — nil、空文字、空配列でないか(Rails拡張)
nil.present? # => false
"".present? # => false
"hello".present? # => true
[].present? # => false
[1].present? # => true
# .blank? — present? の反対(Rails拡張)
nil.blank? # => true
"".blank? # => true
" ".blank? # => true(空白だけの文字列もtrue!)
"hello".blank? # => false
💡
.present?と.blank?はRubyの標準メソッドではなく、 Railsが追加したメソッド(Active Supportの拡張) です。Rails環境では使えるが、純粋なRubyスクリプトでは使えません。
📝 文字列操作の基本
Railsでは、ユーザーの入力値(params)やDBから取得したデータを加工する場面が頻繁にある。よく使う文字列操作を整理しておきます。
式展開 — 文字列にRubyの値を埋め込む
式展開(string interpolation) は、ダブルクォーテーションで囲んだ文字列の中に #{} でRubyの式を埋め込む書き方です。
name = "田中"
age = 25
# 式展開(ダブルクォーテーション) — Rubyで最もよく使う
"#{name}さんは#{age}歳です" # => "田中さんは25歳です"
# シングルクォーテーションでは式展開が効かない
'#{name}さんは#{age}歳です' # => "#{name}さんは#{age}歳です"(そのまま出力)
式展開の中には任意のRubyの式を書ける。メソッド呼び出しや計算もOKです。
"記事数: #{articles.count}件"
"合計: #{price * quantity}円"
よく使う文字列メソッド
# 前後の空白を除去(ユーザー入力のクリーニングで頻出)
" Ruby ".strip # => "Ruby"
# 置換(gsub = global substitution:全箇所を置換)
"Hello World".gsub("World", "Ruby") # => "Hello Ruby"
# 分割(CSVの解析やタグの処理などで使う)
"Ruby,Rails,SQL".split(",") # => ["Ruby", "Rails", "SQL"]
# 含まれているか
"Ruby on Rails".include?("Rails") # => true
# 長さ
"こんにちは".length # => 5
型変換 — paramsは常にString
Railsの paramsはすべてString(文字列)で送られてくる。これを知らないと思わぬエラーにハマります(→ 第14章でStrong Parametersを詳しく扱います)。
# paramsから受け取った値はString
page = params[:page] # => "3"(文字列の "3")
page + 1 # => TypeError!(文字列に数値は足せない)
# 型変換で解決
page.to_i + 1 # => 4(Integer に変換してから計算)
主な型変換メソッドはこの4つです。
# String → 数値
"42".to_i # => 42 (Integer へ変換)
"3.14".to_f # => 3.14 (Float へ変換)
# 数値 → String
42.to_s # => "42"
# nil の型変換(エラーにならないので注意)
nil.to_i # => 0 (nilは 0 になる)
nil.to_s # => "" (nilは空文字列になる)
⚠️
nil.to_iが0を返し、nil.to_sが""を返すのは便利な反面、 「nilであることに気づけない」 というリスクもある。nilであることを明示的に確認したい場面では、to_iで変換せずに.nil?で先に確認するのが安全です。
💼 面接で聞かれたら?
Q:Rubyの動的型付けとは何ですか?
「動的型付けとは、変数に型の宣言が不要で、実行時にデータの型が決まる仕組みです。たとえば同じ変数に文字列を入れた後で数値を入れ直すこともできます。柔軟に書ける反面、意図しない型のデータが混入するリスクがあるため、テストやバリデーションで補う必要があります。」
深掘りされたら:
- 「静的型付けとの違いは?」→ 静的型付け(Java, TypeScript等)は変数宣言時に型を指定する。コンパイル時に型の不整合を検出できる利点がある。
- 「SymbolとStringの違いは?」→ Symbolは不変の識別子で、同じ名前なら必ず同じオブジェクトが再利用される。Stringは毎回新しいオブジェクトが作られる。ハッシュのキーやメソッドの引数名にはSymbolが使われる。
🔗 もっと深く知りたい人へ(1次情報リンク)
- Ruby公式リファレンス:制御構造 — if / unless / case の公式解説
- Ruby公式リファレンス:Symbol — Symbolの仕様と全メソッド
- Ruby公式リファレンス:String — 文字列操作の全メソッド
- Ruby公式リファレンス:NilClass — nilの仕様
まとめ
- ✅ 変数は「箱」ではなく「ラベル」。オブジェクトへの参照に名前をつけたもの
- ✅ Rubyは動的型付け — 変数に型宣言が不要で、実行時に型が決まる
- ✅ 条件分岐は
if/elsif/else、unless、caseの3パターン。Railsで毎日使う - ✅ Rubyで偽と判定されるのは
falseとnilだけ。0や""は真(JavaScriptと違う) - ✅ Symbolは不変の識別子。Hashのキーやメソッド引数に使う。Stringは変わるデータに使う
- ✅ nilは「値が存在しない」を表す。
&.(ぼっち演算子)で安全にメソッドを呼べる - ✅
.present?/.blank?はRails拡張。paramsは常にStringなのでto_iで型変換する
📝 後編では Array(配列)・Hash(ハッシュ)・メソッドの定義と呼び出しを扱います。
→ 第1章②|Ruby文法基礎(後編:配列・ハッシュ・メソッド)
📚 シリーズ目次:「今さら学ぶ」シリーズ — はじめに