結論

Rubyは、まつもとゆきひろ氏が作った日本生まれのオブジェクト指向スクリプト言語です。書いた文をすぐ実行でき、Web アプリ(Ruby on Rails)や作業の自動化に広く使われています。2026年10月29日時点の最新の安定版は 4.0.9 です。

この記事でわかること

  • Rubyの特徴・できること・最新版と、入れ方の確かめ方
  • 基本文法とよくあるエラーを Ruby 3.2・3.3 で実行した原文
  • Pythonと同じ処理を書いて動かした違いと実測

2026年10月29日更新|Ruby 3.2.3(apt)・3.3.6・Python 3.13 で実行確認

Rubyで書いたプログラムは、ruby コマンドがその場で読んで実行します。部品(gem)を足して機能を広げ、Bundler で部品の版をそろえ、その上に Web フレームワークの Rails が乗る、という関係です。

flowchart TD
    C[自分のコード .rb] --> R[ruby で実行<br>irb で試す]
    G[gem 部品] --> B[Bundler で<br>版をそろえる]
    B --> R
    R --> RA[Rails などで<br>Web アプリ]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
Rubyとは 日本生まれのオブジェクト指向スクリプト言語。すべての値がオブジェクト Rubyとは
Rubyで何ができる Web アプリ(Rails)・自動化スクリプト・テキスト処理・API Rubyでできること
Rubyの最新バージョン 4.0.9(2026年10月23日)。3.4 系・3.3 系も更新中 Rubyの最新バージョン
Rubyのインストール Windows は RubyInstaller、Mac は Homebrew など、Linux はパッケージ管理 インストールとirb
Ruby入門で最初に覚える文法 変数・文字列・配列・ハッシュ・ブロック(each・map)・クラス Ruby入門①〜③
undefined method for nil nil に対してメソッドを呼んだ。値が入っていない よくあるエラー
gem・Bundlerとは gem は部品、Bundler は Gemfile で部品の版をそろえる道具 gemとBundler
RubyとPythonの違い 真偽の扱い・割り算・存在しない要素の扱いが違う RubyとPythonの違い
Ruby on Railsとは Rubyで書かれた Web アプリのフレームワーク。最新は 8.1.4 Ruby on Railsの位置づけ

確認環境:Ubuntu 24.04.5 LTS の上で、apt で入れた Ruby 3.2.3(パッケージ ruby3.2 3.2.3-1ubuntu0.24.04.8・RubyGems 3.4.20・Bundler 2.4.20・irb 1.6.2・rake 13.0.6)を主に使い、同じ環境にあった Ruby 3.3.6 でもエラー文言と速さを比べました。文法・例外・エラーの原文は、それぞれ小さな .rb ファイルを作って ruby コマンドで実行した出力です。gem の取得先(rubygems.org)へはこの環境から接続できなかったため、gem は自作の小さな gem を gem build・gem install --local で入れ、Bundler は Gemfile の path: 指定と同梱の minitest で動かしました。Web の例は Ruby の WEBrick を 127.0.0.1 で起動して curl 8.5.0 で確かめています。Python は 3.13.18 で同じ処理を書いて実行し、速さは同じ環境で各5回実行した中央値です。Ruby 3.4・4.0 の変更点・最新版・サポートの状況は ruby-lang.org、Rails は rubyonrails.org と Rails ガイド、規格は ISO の公式ページで確かめました。Rails は動かしていません。図は mermaid で描画を確かめています(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Rubyとは?入門|基本文法・エラー原文・Pythonとの違いを実行で確認」

Rubyとは(特徴を一言でいうと)

この節では、Rubyがどんな言語で、ほかの言語と比べて何が特徴なのかが分かります。

Rubyは、まつもとゆきひろ氏(Matz)が開発し、1995年に公開したオブジェクト指向のスクリプト言語です。 オープンソースで、無料で使えます。2012年には、日本で作られたプログラミング言語として初めて国際規格 ISO/IEC 30170 になりました(ISO の公式ページでは、2026年に見直されて今も有効と確認されています)。

ruby-lang.org の「Rubyとは」のページには、作者の言葉として「Rubyをシンプルなものではなく、自然なものにしようとしている」と書かれています。少ない記号で、英語の文に近い形で書けるように作られています。

1すべてがオブジェクト

数の 5 も nil もオブジェクトで、メソッドを持つ。手元で 5.methods.size は 142 だった。

2ブロックで書ける

3.times { ... } のように、処理のかたまりをメソッドに渡せる。繰り返しや後片付けを短く書ける。

3動的型付け

変数に型を書かない。実行してから型の誤りが分かるため、エラーの読み方が大切になる。

4あとから広げられる

組み込みのクラスにもメソッドを足せる。モジュールを include して機能を混ぜる(Mixin)。

名前は宝石のルビーから来ています。先にあった言語 Perl(真珠)を意識した名前だと、多くの解説で紹介されています。

インタプリタ言語であること

Ruby は、書いたコードを前もって機械語に変えておく(コンパイルする)手間がなく、ruby ファイル名.rb でそのまま動きます。手元で何もしないプログラムを起動したときの時間は約0.06秒でした。速さが一番の目的の言語ではなく、書きやすさと読みやすさを大事にした言語です。速さは後の節で Python と比べています。

Rubyでできること・向いていること

この節では、Rubyが仕事や個人の開発で何に使われているか、向いていないことは何かが分かります。

Rubyがいちばん使われているのは、Ruby on Rails を使った Web アプリの開発です。 Rails の公式サイトには、GitHub・Shopify・Airbnb・Cookpad などのロゴが「Rails を使っている会社の一部」として並んでいます(2026年10月29日時点)。

1

Web アプリ

Rails で、会員登録・投稿・管理画面のあるサービスを作る。少ないコードで形にしやすい。

いちばん多い用途

2

API サーバー

JSON を返すサーバー。下の例は標準の部品だけで、127.0.0.1 に小さな API を立てた。

Rails・Sinatra など

3

自動化・テキスト処理

ログの集計、CSV の加工、ファイルの一括の名前変更。1行で書ける ruby -ne もある。

シェルの代わりに

4

開発の道具

Homebrew(Mac のパッケージ管理)や、静的サイトを作る Jekyll などが Ruby で書かれている。

裏で動いていることも

標準の部品だけで API を動かした例

Ruby の WEBrick(apt の ruby-webrick に入っている小さな Web サーバー)で、名前を受け取って JSON を返すサーバーを 127.0.0.1 に立てました。

require "webrick"
require "json"
server = WEBrick::HTTPServer.new(BindAddress: "127.0.0.1", Port: 45855)
server.mount_proc "/hello" do |req, res|
  name = req.query["name"] || "world"
  res["Content-Type"] = "application/json"
  res.body = JSON.generate({ message: "Hello, #{name}!", ruby: RUBY_VERSION })
end
trap("TERM") { server.shutdown }
server.start
$ curl -i 'http://127.0.0.1:45855/hello?name=RJC'
HTTP/1.1 200 OK
Content-Type: application/json
Server: WEBrick/1.8.1 (Ruby/3.2.3/2024-01-18)
Content-Length: 40

{"message":"Hello, RJC!","ruby":"3.2.3"}

(Date などの行を省いています。)WEBrick は Ruby 3.0 から標準添付ではなくなったため、Ruby を公式の方法で入れた場合は gem として足します。学習用の小さなサーバーには便利ですが、本番の Web アプリには Rails と Puma などのサーバーを使うのが一般的です。

向いていないこと

  • 機械学習・データ分析:ライブラリと資料は Python が圧倒的に多く、Ruby を選ぶ理由は少ないです。
  • スマホアプリ・ゲーム:Swift・Kotlin・C# など、それぞれの環境の言語が中心です。
  • 計算の速さが最優先の処理:C・Rust・Go などが向いています。

Rubyの最新バージョン(4.0・3.4)と公式の状況

この節では、2026年10月29日時点で、どの版を使えばよいかと、各版のサポートの状況が分かります。

2026年10月29日時点の最新の安定版は Ruby 4.0.9 です。 ruby-lang.org のダウンロードのページには「The current stable version is 4.0.9.」とあり、安定版として 4.0.9 と 3.4.12 が並んでいます。Ruby は毎年12月25日に新しい版(x.y.0)を出すのが慣例で、4.0.0 は2025年12月25日に出ました。

4.0.9最新の安定版2026年10月23日
3.4.123.4 系の最新同じ日に公開
4.1.0-preview1次の版の試し版2026年10月12日
系列 状態(ruby-lang.org) 最初の公開 サポート終了
4.0 通常のメンテナンス 2025年12月25日 未定
3.4 通常のメンテナンス 2024年12月25日 未定
3.3 セキュリティ修正のみ 2023年12月25日 2027年3月31日の見込み
3.2 EOL(サポート終了) 2022年12月25日 2026年4月1日

apt で入る版は 3.2

Ubuntu 24.04 で apt install ruby を実行すると、入るのは Ruby 3.2.3 でした。ruby-lang.org では 3.2 系は EOL ですが、パッケージの版が 3.2.3-1ubuntu0.24.04.8 となっているとおり、Ubuntu 側で修正を当てた版が配られています。入門の文法を学ぶには 3.2 でも困りませんが、この記事で紹介する 3.4 以降の書き方(it など)は使えません。 新しく始めるなら 3.4 か 4.0 を入れるのが確実です。

Ruby 3.4・4.0 で変わった主な点(入門者に関係するもの)

版 変更 入門で気づく場面
3.4 ブロックの引数を名前なしで使える it langs.map { it.upcase }。3.2 では NameError になった
3.4 エラー文の引用符がバッククォートからシングルクォートに undefined method 'upcase' for nil の形になる
3.4 ハッシュの表示が {name: "Alice"} の形に 3.2・3.3 では {:name=>"Alice"} と表示された
3.4 文字列リテラルを書き換えると、将来 freeze される予告の警告(-W:deprecated で表示) s << "x" のような書き換え
4.0 Set がコアクラスに。表示は Set[1, 2, 3] require なしで Set が使える
4.0 実験的な機能 Ruby Box・新しい JIT(ZJIT) 入門では使わない。公式は本番での利用を控えるよう案内

4.0 は大きな番号の変更ですが、公式のリリースノートでは、互換性の注意は主に Ractor(並列処理)の API の変更や一部の標準ライブラリの扱いです。入門の文法は 3.x と同じように書けます。

Rubyのインストールとirbで最初のコードを動かす

この節では、Windows・Mac・Linux での入れ方(公式の案内)と、入ったことを確かめて最初のコードを動かす手順が分かります。

ruby-lang.org のインストールガイドは、OS ごとに次の方法を案内しています。 Windows と Mac の手順は、この環境では動かせないため公式の記載のとおりに載せています。

OS 公式が案内する方法 コマンドの例
Windows RubyInstaller(winget・Chocolatey でも可)。WSL の Linux に入れる方法も winget(下のコマンド)
Mac Homebrew。El Capitan 以降は Ruby 2.0 以上が同梱されているが、最新の安定版を入れるよう案内 brew install ruby
Ubuntu・Debian パッケージ管理(そのディストリビューションの版が入る) sudo apt-get install ruby-full
複数の版を使い分け rbenv+ruby-build・asdf・chruby・RVM など 各ツールの公式の手順
> winget install RubyInstallerTeam.RubyWithDevKit.3.4

winget の {MAJOR}.{MINOR}(上の 3.4 の部分)には使いたい版を入れます。公式ガイドは、gem を作ったり C の拡張を使ったりするプロジェクトには DevKit 付き(RubyWithDevKit)を選ぶよう書いています。

1

版を確かめる

ターミナル(Windows は PowerShell やコマンドプロンプト)で ruby -v を実行する。版が出れば入っている。

手元:ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6)

2

どの ruby が動いているか確かめる

Linux・Mac は which ruby、Windows は where ruby。複数入っていると、思っていない版が動く。

手元では /usr/local/bin に 3.3.6、/usr/bin に 3.2.3 があった

3

irb で1行ずつ試す

irb と打つと対話の画面になる。式を入れると結果が => の後ろに出る。exit で終わる。

irb 1.6.2

4

ファイルに書いて実行する

hello.rb に puts "Hello, Ruby!" と書き、ruby hello.rb で実行する。

拡張子は .rb

手元で irb を起動して打った結果です(色を消し、入力の行と結果だけを残しています)。

irb(main):001:0> 1 + 2
=> 3
irb(main):002:0> "ruby".upcase
=> "RUBY"
irb(main):003:0> [3, 1, 2].sort
=> [1, 2, 3]
irb(main):004:0> puts "hi"
hi
=> nil
irb(main):005:0> 5.methods.size
=> 142
irb(main):006:0> nil.upcase
(irb):6:in `<main>': undefined method `upcase' for nil:NilClass (NoMethodError)

puts "hi" は画面に hi を出し、メソッドの戻り値は nil です。irb は「戻り値」を => で見せるので、表示と戻り値の違いがよく分かります。エラーになっても irb は終わらず、続けて打てます。

ruby -e と -c

$ ruby -e 'puts 1 + 2'
3
$ ruby -c basics3.rb
Syntax OK
$ head -3 words.txt | ruby -ne 'puts $_.split.first(3).join(",")'
cherry,banana,python
java,apple,rust
apple,apple,apple

-e はその場のコードを実行、-c は文法だけを確かめ、-n は入力を1行ずつ $_ に入れて繰り返します。awk や sed の代わりにも使えます。

日本語で出たつまずき(LANG が空のとき)

環境変数 LANG が空の端末で、-e に日本語を書くと、次のエラーになりました。LANG=C.UTF-8 を付けると動きました。

$ ruby -e 'p "真"'
-e:1: invalid multibyte char (US-ASCII)
-e: compile error (SyntaxError)

$ LANG=C.UTF-8 ruby -e 'p "真"'
"真"

.rb ファイルは UTF-8 として読まれるので動きますが、p で日本語を表示すると "真" のようなエスケープになりました。Docker のコンテナや CI など、LANG が設定されていない環境で起きやすいので、LANG=C.UTF-8(または ja_JP.UTF-8)を設定します。

Ruby入門①変数・数値・文字列(すべてがオブジェクト)

この節では、変数の作り方、数の計算、文字列の扱いを、実行した結果で確かめられます。

Ruby の変数は宣言が要らず、名前 = 値 と書けば作られます。 型は値の側が持っていて、.class で確かめられます。

name = "Ruby"
puts "Hello, #{name}!"    # ダブルクォートは #{} で式を埋め込める
puts 'Hello, #{name}!'    # シングルクォートは埋め込まない
p name                    # p は「中身がわかる形」で表示
puts 7 / 2
puts 7 / 2.0
puts 2 ** 100
puts 0.1 + 0.2
puts 10.class
puts nil.class
puts "日本語".length
puts "日本語".bytesize
puts "a,b,c".split(",").inspect
puts "Ruby" * 3
s = "hello"
s << " world"             # 文字列はその場で書き換えられる
puts s
puts "10" + 5.to_s
puts "10".to_i + 5
x = nil
puts (x || "既定値")
Hello, Ruby!
Hello, #{name}!
"Ruby"
3
3.5
1267650600228229401496703205376
0.30000000000000004
Integer
NilClass
3
9
["a", "b", "c"]
RubyRubyRuby
hello world
105
15
既定値
結果 読み取れること
7 / 2 が 3 整数どうしの割り算は小数点以下を切り捨てる。小数が欲しければ 7 / 2.0 か 7.fdiv(2)
2 ** 100 がそのまま出る 整数に桁の上限が無い(多倍長整数)
0.1 + 0.2 が 0.30000000000000004 小数(Float)の誤差。お金の計算は BigDecimal や Rational を使う
"日本語".length が 3、bytesize が 9 length は文字数、bytesize は UTF-8 のバイト数
"10" + 5.to_s が 105 文字列と数は自動で変換されない。to_s・to_i で明示する
x || "既定値" nil のときに代わりの値を使う定番の書き方

puts・print・p の違い

$ ruby -e 'puts [1, nil, "a"]; print "x", "y", "\n"; p [1, nil, "a"]'
1

a
xy
[1, nil, "a"]

puts は配列を1要素1行で出し、nil は空行になります。print は改行しません。p は inspect の形(文字列なら引用符つき、nil は nil)で出すので、値を調べるときは p が向いています。

シンボルと定数

:ok のようにコロンで始まるものはシンボル(Symbol)で、名前を表す軽い値です。同じシンボルは常に同じオブジェクトで、手元で :a.object_id == :a.object_id は true、"a".object_id == "a".object_id は false でした。ハッシュのキーによく使います。大文字で始まる名前(MAX = 10)は定数で、クラス名も定数です。

Ruby入門②配列・ハッシュ・ブロック(each・map)

この節では、データをまとめて扱う配列とハッシュ、Ruby らしい繰り返しのブロックの書き方が分かります。

Ruby では、繰り返しを for ではなく、each や map にブロック({ |変数| ... } か do ... end)を渡して書くのが一般的です。

langs = ["Ruby", "Python", "Go"]
langs << "Rust"
p langs
p langs[0], langs[-1], langs[10]
p langs.include?("Go")
langs.each_with_index do |l, i|
  puts "#{i}: #{l}"
end
p langs.map { |l| l.upcase }
p langs.map(&:length)
p langs.select { |l| l.length <= 4 }
p langs.reject { |l| l.start_with?("R") }
p (1..10).select(&:even?)
p [1, 2, 3, 4].reduce(0) { |sum, n| sum + n }
p langs.group_by(&:size)
["Ruby", "Python", "Go", "Rust"]
"Ruby"
"Rust"
nil
true
0: Ruby
1: Python
2: Go
3: Rust
["RUBY", "PYTHON", "GO", "RUST"]
[4, 6, 2, 4]
["Ruby", "Go", "Rust"]
["Python", "Go"]
[2, 4, 6, 8, 10]
10
{4=>["Ruby", "Rust"], 6=>["Python"], 2=>["Go"]}
  • langs[10] は、範囲の外でもエラーにならず nil を返しました。 後で nil にメソッドを呼んで NoMethodError になる原因の1つです。
  • langs[-1] は最後の要素です。
  • map(&:length) は map { |l| l.length } の短い書き方です。

each(繰り返すだけ)

各要素で処理をする

戻り値は元の配列

表示・保存など「すること」向き

map(変換して集める)

ブロックの結果を集めた新しい配列を返す

元の配列は変わらない

「別の形に変える」向き

ハッシュ(キーと値の組)

user = { name: "Alice", age: 30 }
p user
p user[:name]
p user[:email]
user[:email] = "alice@example.com"
user.each { |k, v| puts "#{k} => #{v}" }
p user.fetch(:age)
counts = Hash.new(0)
"banana".each_char { |c| counts[c] += 1 }
p counts
{:name=>"Alice", :age=>30}
"Alice"
nil
name => Alice
age => 30
email => alice@example.com
30
{"b"=>1, "a"=>3, "n"=>2}

{ name: "Alice" } はキーがシンボルのハッシュです。無いキーを [] で読むと nil、fetch で読むと KeyError になります。 必ずあるはずのキーは fetch で読むと、誤りに早く気づけます。Hash.new(0) は、無いキーの既定値を 0 にしたハッシュで、数え上げに便利です。Ruby 3.4 以降では、表示が {name: "Alice", age: 30} の形に変わります(公式のリリースノート)。

Ruby 3.4 の it

Ruby 3.4 で、ブロックの引数を名前なしで参照する it が入りました。手元の 3.2 で書くと、次のとおりエラーになりました。

p langs.map { it.downcase }
#=> #<NameError: undefined local variable or method `it' for main:Object>   (Ruby 3.2.3)

公式のリリースノートの例は ary.map { it.upcase } です。手元の Ruby の版が 3.4 未満なら、{ |l| l.downcase } と名前を付けて書きます。

Ruby入門③条件分岐・メソッド・クラス・モジュール

この節では、if・case・繰り返し、メソッドの定義、クラスとモジュールの書き方が、実行結果つきで分かります。

score = 72
if score >= 80
  puts "A"
elsif score >= 60          # else if ではなく elsif
  puts "B"
else
  puts "C"
end
puts "合格" if score >= 60  # 後ろに置く if
grade = case score
        when 90.. then "S"
        when 70...90 then "A"
        else "B"
        end
puts grade
p [0, "", [], nil, false].map { |v| v ? "真" : "偽" }
3.times { |n| print n, " " }
1.step(10, 3) { |n| print n, " " }
B
合格
A
["真", "真", "真", "偽", "偽"]
0 1 2 1 4 7 10

Ruby で偽になるのは nil と false だけです。 0 も空の文字列も空の配列も真になりました。Python や JavaScript から来た人がつまずきやすい点です。空かどうかは empty?、nil かどうかは nil? で確かめます。

メソッド

def greet(name, greeting: "こんにちは")   # greeting: はキーワード引数
  "#{greeting}、#{name}さん"                # 最後の式が戻り値(return は省ける)
end
puts greet("田中")
puts greet("田中", greeting: "おはよう")
def add(a, b) = a + b                       # 1行で書く形(Ruby 3.0 から)
puts add(2, 3)
def twice
  yield                                     # 渡されたブロックを呼ぶ
  yield
end
twice { puts "ブロック" }
こんにちは、田中さん
おはよう、田中さん
5
ブロック
ブロック

メソッド名の末尾の ? は真偽を返すもの(empty?)、! は自分自身を書き換えるなど注意が要るもの(sort!)という慣習があります。

クラスとモジュール

module Greetable
  def greet = "私は#{name}です"
end

class Animal
  include Greetable            # モジュールの機能を混ぜる(Mixin)
  attr_reader :name            # name を読むメソッドを自動で作る
  def initialize(name)         # new のときに呼ばれる
    @name = name               # @ で始まるのはインスタンス変数
  end
  def speak = "..."
  def to_s = "#{self.class.name}(#{@name})"
end

class Dog < Animal             # 継承
  def speak = "ワン"
end

d = Dog.new("ポチ")
puts d.speak, d.greet, d
p Dog.ancestors.take(4)
class Integer                  # 組み込みのクラスにも足せる
  def double = self * 2
end
p 21.double
ワン
私はポチです
Dog(ポチ)
[Dog, Animal, Greetable, Object]
42

Dog.ancestors を見ると、メソッドを探す順番が Dog → Animal → Greetable → Object だと分かります。Ruby のクラスの継承は1つだけで、共通の機能はモジュールの include で足すのが Ruby の基本の設計です。組み込みのクラスにメソッドを足す書き方(オープンクラス)は強力ですが、ほかのライブラリとぶつかることがあるため、アプリのコードでは控えめに使います。オブジェクト指向そのものの考え方は、関連記事「オブジェクト指向とは?コードでわかる基本と使いどころ」で扱っています。

Rubyの例外処理(begin・rescue・ensure・retry)

この節では、エラーが起きたときに処理を続ける書き方と、自分でエラーを起こす書き方が分かります。

Ruby の例外処理は begin〜rescue〜ensure〜end で書きます。 メソッドの中なら begin を省けます。

def parse_age(str)
  Integer(str)
rescue ArgumentError => e       # このエラーだけを受け止める
  puts "変換できません: #{e.message}"
  nil
ensure                          # 成功しても失敗しても必ず動く
  puts "parse_age 終了"
end
p parse_age("30")
p parse_age("三十")

class OutOfStock < StandardError; end   # 自分のエラーの種類
def buy(stock)
  raise OutOfStock, "在庫がありません" if stock.zero?
  "購入しました"
end
begin
  puts buy(0)
rescue OutOfStock => e
  puts "#{e.class}: #{e.message}"
end

attempts = 0
begin
  attempts += 1
  raise "一時的な失敗" if attempts < 3
  puts "#{attempts}回目で成功"
rescue
  retry                         # begin の先頭からやり直す
end
parse_age 終了
30
変換できません: invalid value for Integer(): "三十"
parse_age 終了
nil
OutOfStock: 在庫がありません
3回目で成功
Ruby Python Java
begin try try
rescue 種類 => e except 種類 as e catch (種類 e)
ensure finally finally
raise raise throw
retry (無い。ループで書く) (無い)

例外の受け止め方

避けたいrescue => e で何でも受けて、何もせず先へ進む。原因が分からなくなる
→
代わりにrescue ArgumentError のように種類を絞り、ログを残すか、処理できないなら raise し直す

種類を書かない rescue は StandardError とその子を受け止める

retry の使い方

避けたい回数を数えずに retry する。失敗が続くと止まらない
→
代わりに回数の上限を決め、待ち時間を空けてやり直す

上の例は attempts で回数を数えている

Python の try・except との書き比べは、関連記事「Python例外処理 try exceptの書き方|raise fromも実行で確認」で扱っています。

Rubyのよくあるエラー原文と直し方(NoMethodError・NameError)

この節では、入門でよく出るエラーの原文と、どこを見て何を直せばよいかが分かります。

Ruby のエラーは「ファイル名:行番号:in 場所: メッセージ (エラーの種類)」の形です。 最後のかっこの種類と、行番号を最初に見ます。Ruby 3.1 以降は、エラーの場所を ^^^^ で指してくれます。手元の Ruby 3.2.3 で1つずつ起こしたエラーの原文です。

$ ruby e1.rb        # user = nil; puts user.upcase
e1.rb:2:in `<main>': undefined method `upcase' for nil:NilClass (NoMethodError)

puts user.upcase
         ^^^^^^^

$ ruby e3.rb        # puts name.lenght(綴りの誤り)
e3.rb:2:in `<main>': undefined method `lenght' for "Ruby":String (NoMethodError)

puts name.lenght
         ^^^^^^^
Did you mean?  length

$ ruby e2.rb        # puts nmae
e2.rb:1:in `<main>': undefined local variable or method `nmae' for main:Object (NameError)

$ ruby e6.rb        # if の end を書き忘れ
e6.rb: --> e6.rb
Unmatched keyword, missing `end' ?
> 1  if true
e6.rb:2: syntax error, unexpected end-of-input (SyntaxError)
エラー(原文の要点) 起こしたコード 原因と直し方
NoMethodError:undefined method `upcase' for nil:NilClass nil.upcase 値が入っていない。どこで nil になったかをさかのぼる。user&.upcase で nil のときは呼ばない
NoMethodError:undefined method `lenght' for "Ruby":String 綴りの誤り Did you mean? の候補を見る。length
NameError:undefined local variable or method `nmae' 変数名の誤り・定義前に使った 綴りと、変数を作った場所(スコープ)を見る
NameError:uninitialized constant Foo 無いクラスを使った require 忘れ・クラス名の大文字小文字
ArgumentError:wrong number of arguments (given 1, expected 2) add(1) 引数の数を定義に合わせる
TypeError:no implicit conversion of Integer into String "年齢: " + 20 20.to_s にするか "年齢: #{20}"
SyntaxError:unexpected end-of-input if の end 忘れ Unmatched keyword の行から end の数を数える
LoadError:cannot load such file -- colorize 入っていない gem を require gem install か Gemfile に足して bundle exec
ZeroDivisionError:divided by 0 10 / 0 割る数が 0 かを先に確かめる。10.0 / 0 は Infinity
KeyError:key not found: :email h.fetch(:email) キーを確かめる。fetch(:email, "なし") で既定値
FrozenError:can't modify frozen String: "a" freeze した文字列に << + で新しい文字列を作るか dup してから変える

同じエラーでも版で文言が違う

検索するときに困るのが、版によってエラーの文言が違う点です。同じ e1.rb・e3.rb・e2.rb を、手元の 3.2.3 と 3.3.6 で実行し、3.4 以降は公式のリリースノートの規則(バッククォートがシングルクォートに)で並べました。

版 nil に upcase 文字列に lenght
3.2.3(実行) undefined method `upcase' for nil:NilClass for "Ruby":String
3.3.6(実行) undefined method `upcase' for nil for an instance of String
3.4 以降(公式) undefined method 'upcase' for nil 引用符がシングルクォートになる

3.3 では、NameError も for main:Object から for main に変わりました。エラー文で検索するときは、undefined method とメソッド名だけで検索すると、版の違いに左右されにくくなります。

  • 1かっこの中のエラーの種類を見るNoMethodError・NameError・ArgumentError で直す場所が違う
  • 2一番上の行のファイル名と行番号を開くfrom で続く行は、そこへ来るまでに通った場所
  • 3for の後ろを読むnil なら値が入っていない。String なら型は合っていてメソッド名が違う
  • 4Did you mean? を読む綴りの誤りは候補がそのまま答えになることが多い
  • 5p で直前の値を表示するnil の出どころは p を何か所かに入れると見つかる

gemとBundlerの使い方(Gemfile・bundle exec)

この節では、Ruby の部品である gem と、部品の版をそろえる Bundler の役割と基本のコマンドが分かります。

gem は Ruby のライブラリを配る形式で、gem install 名前 で入れます。Bundler は、プロジェクトに要る gem を Gemfile に書き、bundle install で入れて、Gemfile.lock で版を固定する道具です。 チームで同じ版を使うために、アプリでは Bundler を使うのが一般的です。

コマンド すること
gem install 名前 gem を入れる(取得先は既定で rubygems.org)
gem list 入っている gem の一覧。手元の 3.2.3 では標準の gem だけで92行あった
bundle init 空の Gemfile を作る
bundle install Gemfile の gem を入れ、Gemfile.lock を作る
bundle exec ruby main.rb Gemfile.lock の版で実行する
gem build・gem install --local 自分の gem を作って、手元のファイルから入れる

手元で動かした流れ

この環境からは rubygems.org に接続できなかったため、取得のエラーの原文と、接続しなくてもできる範囲(自作の gem・Gemfile の path 指定・同梱の minitest)を動かしました。

$ gem install colorize
ERROR:  While executing gem ... (Net::HTTPClientException)
    403 "Forbidden"

$ bundle install          # Gemfile に gem "rails" と書いた場合
Could not reach host index.rubygems.org. Check your network connection and try
again.

社内のプロキシの内側などで gem が取れないときは、このどちらかの文言になります。プロキシの設定(環境変数 HTTPS_PROXY)や、社内のミラーを source に指定する方法を、ネットワークの管理者に確かめます。

次に、小さな gem を自分で作って入れました。

# hello_rjc.gemspec
Gem::Specification.new do |s|
  s.name    = "hello_rjc"
  s.version = "0.1.0"
  s.summary = "練習用の小さな gem"
  s.authors = ["RJC"]
  s.files   = ["lib/hello_rjc.rb"]
  s.license = "MIT"
end

# lib/hello_rjc.rb
module HelloRjc
  def self.greet(name) = "こんにちは、#{name}さん"
end
$ gem build hello_rjc.gemspec
WARNING:  no homepage specified
  Successfully built RubyGem
  Name: hello_rjc
  Version: 0.1.0
  File: hello_rjc-0.1.0.gem
$ gem install --local --no-document ./hello_rjc-0.1.0.gem
Successfully installed hello_rjc-0.1.0
1 gem installed
$ ruby -e 'require "hello_rjc"; puts HelloRjc.greet("佐藤")'
こんにちは、佐藤さん

続いて Bundler です。bundle init で作った Gemfile に2行を足しました。

# Gemfile
source "https://rubygems.org"
gem "hello_rjc", path: "../hello_rjc"
gem "minitest"
$ bundle install --local
Resolving dependencies...
Bundle complete! 2 Gemfile dependencies, 3 gems now installed.

$ cat Gemfile.lock
PATH
  remote: ../hello_rjc
  specs:
    hello_rjc (0.1.0)

GEM
  remote: https://rubygems.org/
  specs:
    minitest (5.16.3)
...
BUNDLED WITH
   2.4.20

$ bundle exec ruby main.rb
こんにちは、鈴木さん

Gemfile.lock には、実際に使う版(minitest 5.16.3)が書かれます。Gemfile.lock は Git に入れて共有し、ほかの人は bundle install で同じ版をそろえます。 Gemfile の無い場所で bundle exec を実行すると、Could not locate Gemfile or .bundle/ directory になりました。

テストを書く(minitest)

Ruby には minitest というテストの gem が同梱されています(3.2.3 では 5.16.3)。わざと1つ失敗するテストを書いて実行しました。

require "minitest/autorun"
require "hello_rjc"

class HelloTest < Minitest::Test
  def test_greet
    assert_equal "こんにちは、鈴木さん", HelloRjc.greet("鈴木")
  end

  def test_greet_wrong
    assert_equal "こんばんは、鈴木さん", HelloRjc.greet("鈴木")
  end
end
$ bundle exec ruby test/hello_test.rb --seed 1234
Run options: --seed 1234

# Running:

.F

  1) Failure:
HelloTest#test_greet_wrong [test/hello_test.rb:10]:
Expected: "こんばんは、鈴木さん"
  Actual: "こんにちは、鈴木さん"

2 runs, 2 assertions, 1 failures, 0 errors, 0 skips

. は成功、F は失敗です。Rails の既定のテストも minitest が土台です。RSpec という別のテストの gem もよく使われます。

Ruby on Railsの位置づけ(Rubyとの関係)

この節では、Ruby と Ruby on Rails の関係と、Rails の考え方を公式の説明の範囲で確かめられます。この記事では Rails は動かしていません。

Ruby はプログラミング言語、Ruby on Rails(Rails)は Ruby で書かれた Web アプリのフレームワーク(gem の1つ)です。 Rails を使うには Ruby が要りますが、Ruby を使うのに Rails は要りません。

項目 公式で確かめた内容(2026年10月29日時点)
最新版 Rails 8.1.4(2026年9月24日)
必要な Ruby Rails ガイド(入門)で Ruby 3.2 以上
考え方 DRY(同じことを繰り返さない)と、設定より規約(Convention over Configuration)
作り MVC(Model がデータ、View が画面、Controller がリクエストの処理)
始め方 rails new store でアプリの雛形を作る(Rails ガイド)

Rails ガイドは、Rails を「意見の強い(opinionated)」ソフトウェアと説明しています。決まった置き場所と名前に従えば、設定を書かずに動く部分が多く、少ないコードで形になります。その代わり、Rails の決まりを知らないと「なぜ動くのか」が見えにくいため、Ruby の文法(特にブロック・ハッシュ・クラス・シンボル)を先に押さえてから Rails に進むと、つまずきが減ります。

Ruby の Web フレームワークは Rails のほか、小さく書ける Sinatra、Hanami などがあります。

RubyとPythonの違い(同じ処理を実行して比較)

この節では、よく比べられる Python と Ruby の違いを、同じ処理を両方で書いて実行した結果で確かめられます。

どちらも動的型付けのスクリプト言語で、書きやすさを大事にしている点は同じです。違いは、文法の細部と、得意な分野(Ruby は Web、Python は AI・データ分析)に出ます。

同じ値の扱いが違うところ

試したこと Ruby 3.2.3 Python 3.13.18
0・""・[] の真偽 すべて真 すべて偽
7 / 2 3(整数のまま) 3.5(7 // 2 が 3)
-7 / 2 -4 -7 // 2 も -4
範囲外の要素 [10] nil を返す IndexError: list index out of range
無いキー h[:email] は nil d["email"] は KeyError
文字列+数 TypeError: no implicit conversion of Integer into String TypeError: can only concatenate str (not "int") to str
None・nil にメソッド NoMethodError(for nil) AttributeError: 'NoneType' object has no attribute 'upper'

Ruby は、無いものを nil で返す場面が多く、Python は例外にする場面が多いという違いが、手元の結果でもはっきり出ました。Ruby で nil のエラーが多いのはこのためです。

同じ処理を書き比べる(単語を数える)

200,000行(約11MB)の英単語のファイルから、出てくる回数の多い単語の上位3つを数えるプログラムです。

counts = Hash.new(0)
File.foreach("words.txt") do |line|
  line.split.each { |w| counts[w] += 1 }
end
counts.sort_by { |w, c| -c }.first(3).each { |w, c| puts "#{w}: #{c}" }
from collections import Counter
counts = Counter()
with open("words.txt") as f:
    for line in f:
        counts.update(line.split())
for w, c in counts.most_common(3):
    print(f"{w}: {c}")
cherry: 250783
java: 250409
ruby: 250080

どちらも同じ結果になりました。Ruby はブロック(do ... end・{ })とメソッドのつなぎ方で書き、Python はインデントと標準ライブラリの Counter で書いています。

観点 Ruby Python
ブロックの区切り end(インデントは見た目だけ) インデントそのもの
「無い」値 nil None
繰り返し each・map にブロック for とリスト内包表記
書き方の自由さ 同じことを何通りにも書ける(かっこの省略など) 「やり方は1つ」を重んじる
得意な分野 Web アプリ(Rails)・自動化 AI・データ分析・自動化・Web
部品の管理 gem・Bundler(Gemfile) pip・uv など(requirements.txt・pyproject.toml)

速さとメモリ(同じ環境で5回の中央値)

処理 Ruby 3.2.3 Ruby 3.3.6 Python 3.13.18
何もしないで終わる(起動) 0.061秒 0.061秒 0.014秒
単語を数える(11MB) 0.695秒 1.085秒 0.339秒
再帰でフィボナッチ数 fib(30) 0.155秒 0.170秒 0.132秒
2,000万回の足し算のループ 0.578秒 0.834秒 2.120秒
最大メモリ(起動時) 22.7MB 19.0MB 13.9MB

2つの CPU を持つ共有の環境で、ほかの処理も動いていたため、ぶれがあります(3.3.6 の単語数えは最小で 0.720秒)。単純なループは Ruby が速く、単語を数える処理は C で書かれた Counter を使う Python が速い、という結果で、どちらが常に速いとは言えません。 どちらの Ruby も JIT(YJIT)を含まない作りで、--yjit を付けると「Ruby was built without YJIT support」の警告が出ました。公式の版を YJIT 付きで作ると、速さはさらに変わります。

Rubyの学ぶ順番と、Rubyを選ぶかの判断表

この節では、Ruby 入門から Rails に進むまでの順番と、Ruby を選ぶとよい場面が分かります。

  1. 1irb で式と表示を試すputs と p の違い、戻り値の => を見る
  2. 2変数・文字列・数・nil#{} の埋め込み、to_s・to_i、偽は nil と false だけ
  3. 3配列・ハッシュ・ブロックeach・map・select・reduce、シンボルのキー
  4. 4メソッド・クラス・モジュールキーワード引数、attr_reader、include
  5. 5例外とエラーの読み方rescue の種類を絞る、NoMethodError の for の後ろを読む
  6. 6gem・Bundler・テストGemfile・bundle exec・minitest
  7. 7Rails の入門ガイドMVC と規約を知り、小さなアプリを作る

文字列の検索や置換には正規表現を多く使います。Ruby の正規表現は /ruby/i のように書き、ほかの言語との違いは関連記事「正規表現 早見表|記号一覧・言語別の違い・実用パターン(実行結果つき)」で扱っています。ブロックはクロージャ(外側の変数を覚えている関数)の一種で、考え方は関連記事「JavaScript クロージャとは?使いどころ7例をコード付きで図解」が参考になります。

判断表:Ruby を選ぶか

したいこと・状況 Ruby が向くか 理由
Web サービスを少人数で早く作る 向く Rails の規約と雛形で、少ないコードで形になる
Rails で作られた既存のサービスに加わる 向く(必須) Ruby と Rails の両方を読むことになる
サーバーの作業の自動化・テキスト処理 向く ruby -ne の1行から、標準ライブラリで書ける
機械学習・データ分析 Python のほうが向く ライブラリと資料の量が違う
最初の言語として文法を学ぶ 向く 記号が少なく、irb ですぐ試せる。日本語の資料も多い
速さが最優先の処理 あまり向かない Go・Rust・C などを検討する
複数の Ruby の版を切り替えたい rbenv などを使う プロジェクトごとに版を固定できる

複数の版を切り替える道具の考え方は Node.js でも同じで、関連記事「Node.js バージョン管理|nvm・fnm・mise・Volta比較と実測」で比べています。

よくある質問

Q. Rubyとは何ですか? A. まつもとゆきひろ氏が開発し、1995年に公開したオブジェクト指向のスクリプト言語です。数や nil を含むすべての値がオブジェクトで、ブロックを使って短く読みやすく書けます。2012年に国際規格 ISO/IEC 30170 になりました。

Q. Rubyで何ができますか? A. Ruby on Rails を使った Web アプリの開発がいちばん多い用途です。ほかに API サーバー、作業の自動化、テキストやログの処理、開発の道具づくりに使われます。機械学習やスマホアプリには、ほかの言語のほうが向いています。

Q. Rubyの最新バージョンはいくつですか? A. 2026年10月29日時点の最新の安定版は 4.0.9(2026年10月23日)です。3.4 系は 3.4.12、3.3 系は 3.3.13 が同じ日に出ています。3.2 系は2026年4月1日にサポートが終わりました。次の 4.1 は 4.1.0-preview1 が出ています。

Q. RubyとRuby on Railsの違いは何ですか? A. Ruby はプログラミング言語、Rails は Ruby で書かれた Web アプリのフレームワークです。Rails を使うには Ruby が要ります。Rails 8.1 は Ruby 3.2 以上が必要です(Rails ガイド)。

Q. RubyとPythonはどちらを学ぶべきですか? A. Web サービスを作りたい、Rails のサービスに加わりたいなら Ruby、AI やデータ分析に進みたいなら Python が向いています。文法の難しさに大きな差は無く、どちらかを覚えるともう一方も読みやすくなります。

Q. undefined method for nil:NilClass はどう直しますか? A. nil(値が入っていない)に対してメソッドを呼んだエラーです。その変数がどこで nil になったかを p でさかのぼります。配列の範囲外・無いハッシュのキー・見つからなかった検索の結果が nil になりやすい場所です。nil のときは呼ばなくてよいなら user&.name と書きます。

Q. irb とは何ですか? A. Ruby を1行ずつ打って結果を確かめる対話の道具(Interactive Ruby)です。ターミナルで irb と打つと始まり、exit で終わります。結果は => の後ろに表示されます。

Q. gem と Bundler の違いは何ですか? A. gem は Ruby の部品(ライブラリ)とそれを入れるコマンドです。Bundler は、プロジェクトに要る gem を Gemfile に書いて、Gemfile.lock で版をそろえる道具です。アプリでは bundle exec を付けて実行すると、決めた版で動きます。

Q. Windows で Ruby を使うにはどうしますか? A. ruby-lang.org のインストールガイドは、RubyInstaller(winget・Chocolatey でも入れられる)を案内しています。gem を使うプロジェクトでは DevKit 付きを選ぶよう書かれています。WSL の Linux に入れる方法もあります。

Q. Mac には最初から Ruby が入っていますか? A. ruby-lang.org のインストールガイドには、El Capitan(10.11)以降の macOS には Ruby 2.0 以上が同梱されていると書かれています。ただし最新の安定版を使うため、Homebrew(brew install ruby)などで入れるよう案内されています。

Q. Rubyは遅いのですか? A. 手元の計測では、単純なループは Python 3.13 より速く、Counter を使った単語数えは Python のほうが速い結果でした。起動は Python より約0.05秒長くかかりました。処理の中身で結果が変わるため、速さが要る部分は実際の処理で測って決めます。

まとめ

  • Ruby は、まつもとゆきひろ氏が作った日本生まれのオブジェクト指向スクリプト言語。すべての値がオブジェクトで、ブロックで短く書ける。主な用途は Rails の Web アプリと自動化。
  • 2026年10月29日時点の最新は 4.0.9。3.4 系・4.0 系が通常のメンテナンス中で、3.2 系はサポートが終わった。Ubuntu 24.04 の apt で入るのは 3.2.3 だった。
  • 偽は nil と false だけ。範囲外の要素や無いキーは nil を返すため、NoMethodError(for nil)が入門でいちばん多いエラーになる。エラーの文言は 3.2・3.3・3.4 で少しずつ違う。
  • gem は部品、Bundler は Gemfile と Gemfile.lock で版をそろえる道具。gem が取れない環境では 403 や Could not reach host の文言になる。
  • Python とは、真偽・割り算・無い要素の扱いが違う。速さは処理によって入れ替わった。文法を押さえてから Rails のガイドに進むと、つまずきが減る。

参考・出典

確認日はいずれも 2026年10月29日です。

  • ruby-lang.org「Rubyとは」:https://www.ruby-lang.org/ja/about/
  • ruby-lang.org「ダウンロード」:https://www.ruby-lang.org/ja/downloads/
  • ruby-lang.org「Downloads」(The current stable version):https://www.ruby-lang.org/en/downloads/
  • ruby-lang.org「Rubyの各ブランチのメンテナンス状況」:https://www.ruby-lang.org/ja/downloads/branches/
  • ruby-lang.org「News」(Ruby 4.0.9・3.4.12・3.3.13・4.1.0-preview1):https://www.ruby-lang.org/en/news/
  • ruby-lang.org「Ruby 4.0.0 リリース」:https://www.ruby-lang.org/ja/news/2025/12/25/ruby-4-0-0-released/
  • ruby-lang.org「Ruby 3.4.0 リリース」:https://www.ruby-lang.org/ja/news/2024/12/25/ruby-3-4-0-released/
  • ruby-lang.org「Rubyのインストール」:https://www.ruby-lang.org/ja/documentation/installation/
  • Ruby on Rails 公式サイト:https://rubyonrails.org/
  • Rails Guides「Getting Started with Rails」:https://guides.rubyonrails.org/getting_started.html
  • ISO「ISO/IEC 30170:2012 Information technology — Programming languages — Ruby」:https://www.iso.org/standard/59579.html
  • RubyGems Guides「Specification Reference」:https://guides.rubygems.org/specification-reference/

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Rubyとは?入門|基本文法・エラー原文・Pythonとの違いを実行で確認」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー