8.

Ruby(.rb)完全ガイド — Matz/1995・MRI/YARV・Rails・gem/Bundler・Rake・シンボル/ブロック

編集
この記事の要点
  • Ruby はまつもとゆきひろ(Matz)が 1993 年に開発を開始し 1995 年に公開した日本生まれのオブジェクト指向スクリプト言語
  • 「プログラマの幸福度」を最重視した設計、すべてがオブジェクト(数値も nil も)
  • 実行モデルは MRI(Matz Ruby Interpreter、現 CRuby)。YARV バイトコード VM で動作
  • Web アプリケーションフレームワーク Ruby on Rails(DHH、2004)が世界的ブームを牽引
  • パッケージは gem、依存管理は BundlerGemfile / Gemfile.lock
  • タスクランナー Rake(Ruby Make)、ライブラリ仕様は .gemspec
  • シンボル(:name)、ハッシュ({ key: "value" })、ブロック / yield / do...end など独自の表現が豊富

概要

Ruby(ルビー) は、日本人プログラマ まつもとゆきひろ(通称 Matz)が 1993 年に開発を開始し、1995 年 12 月に最初の公開版(0.95)をリリースしたオブジェクト指向スクリプト言語です。「Perl の実用性、Smalltalk の純粋さ、Lisp の表現力」を取り入れることを目指し、何より 「プログラマが書いていて楽しい言語」 を理念に据えました。名前の由来は同僚の Perl からの連想で、宝石名つながりです。

Ruby の設計の根幹は 「すべてはオブジェクト」。整数 1niltrue/false もすべてオブジェクトでメソッドを持ち、1.times {|i| puts i} のように記述できます。動的型付け・強い型・ダックタイピング で、コードは英語の文章に近い読みやすさになるよう細かな構文糖が随所に施されています(unlessuntil5.timesarr.each do |x| ... end など)。

実行モデルは インタプリタ+バイトコード VM。最も普及しているリファレンス実装は MRI(Matz Ruby Interpreter)、別名 CRuby で、1.9 以降 YARV(Yet Another Ruby VM) がバイトコードを実行します。3.0(2020)では Ractor(並列実行)や Fiber Scheduler、3.x で YJIT(Shopify 製の JIT)が導入され、長年の課題だった実行速度を大きく改善しました。代替実装には JRuby(JVM)、TruffleRuby(GraalVM)、mruby(組込み向け)があります。

ファイル種類とビルド成果物

拡張子 / ファイル役割備考
.rbRuby スクリプトUTF-8 が標準。# encoding: utf-8 の magic comment(1.9 以前互換)
.rakeRake タスク定義事実上 Ruby スクリプト。rake コマンドで実行
.gemspecGem パッケージ仕様名前・バージョン・依存・ファイル一覧を Ruby DSL で記述
.gemGem パッケージgem build の出力。gem push で RubyGems.org に公開
Gemfile依存定義Bundler が読む
Gemfile.lock依存ロック本番と開発で同一バージョンに固定するため 必ずコミット
RakefileRake のエントリプロジェクトルートに配置
.erb埋め込み Ruby テンプレートHTML 内に <%= ... %> を埋め込む

「Hello, World」

#!/usr/bin/env ruby
# encoding: utf-8
# hello.rb — 最小の Ruby プログラム

def greet(name)
  "Hello, #{name}!"
end

# シンボルキーを使ったハッシュ
users = [
  { id: 1, name: "Alice" },
  { id: 2, name: "Bob" }
]

users.each do |user|
  puts greet(user[:name])
end

#{...} は文字列内の式展開、:name はシンボル(一意のラベル)、do |user| ... end はブロック構文です。Ruby らしさを凝縮した数行で、メソッド呼び出しの括弧を省略できる点も特徴的です。

パッケージ管理・ビルドツール

  • gem:Ruby 標準のパッケージマネージャ。gem install railsRubyGems.org から取得
  • Bundler:プロジェクトごとの依存解決。bundle install / bundle exec
  • rbenv / rvm / asdf / mise:複数 Ruby バージョンの切替
  • Rake:タスクランナー。rake db:migraterake test など
  • rspec / minitest:テストフレームワーク
  • rubocop:リンタ/フォーマッタ
  • YARD:API ドキュメント生成

関連言語との比較

項目RubyPythonPerlPHP
登場年1995199119871995
パラダイムオブジェクト指向中心マルチパラダイムマルチパラダイム主に手続き+OO
主用途Web(Rails)・スクリプトAI・科学計算・Webテキスト処理Web
ブロック / クロージャdo...end ブロック関数オブジェクトサブルーチンリファレンスクロージャ
パッケージgempipCPANComposer
並行モデルThread + GVL / Ractor / FiberThread + GILThread / forkマルチプロセス

注意点・落とし穴

  • GVL(Giant VM Lock):MRI も Python 同様にスレッド並列実行を制限する。CPU バウンドは Ractor / プロセス並列で対応
  • シンボル vs 文字列:name"name" は別オブジェクト。シンボルは GC されない期間が長いので動的生成は注意(3.x で改善)
  • nil の伝播obj.foo.bar の途中で nil が出ると NoMethodError&.(safe navigation)や dig で回避
  • モンキーパッチ:標準クラスを後から変更できる強力さは諸刃の剣。refinements を使えばスコープ限定可能
  • マジックコメントとエンコーディング:1.9 以降は UTF-8 既定。古いコードや特殊な処理では # encoding: ... が必要
  • Gemfile.lock のコミット:アプリは必ずコミット、Gem ライブラリではコミットしない(運用差)
  • Rails 依存への傾倒:Ruby 学習が「Rails の知識」と混同されやすい。素の Ruby としての挙動を理解しておく

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Python(.py / .pyc)
  2. JavaScript(.js / .mjs / .cjs)
  3. TypeScript(.ts / .tsx)
  4. Go(.go)
  5. Rust(.rs)
  6. Java(.java / .class / .jar)
  7. C / C++(.c / .h / .cpp / .hpp)
  8. Ruby(.rb)
  9. Swift(.swift)
  10. Kotlin(.kt / .kts)

最近更新/作成されたページ