本文へスキップ
BecomeCoder

Rubyコース · 第9章 実務のRuby ― 記法を深める · レッスン43

モダンRubyとこれから ― パターンマッチ・構造体・Bundler

ローカル実施

導入

最後に、近年の Ruby(3.x)で加わった記法や、実務プロジェクトを支える道具を「読み物」として紹介します。この学習環境の簡易ランナーでは動かないものもありますが、実際の Ruby では日常的に使われます。「こういうものがある」と知っておくと、現場のコードで戸惑いません。

説明

パターンマッチ(case / in は Ruby 3.0 で正式に入った、構造を分解しながら条件分岐する記法です。ハッシュ配列の中身を、形に合わせて一気に取り出せます。

data = { name: "太郎", role: :admin }

case data
in { name: String => name, role: :admin }
  puts "#{name} は管理者です"
in { name: String => name }
  puts "#{name} は一般ユーザーです"
end

Struct(構造体) は、データをまとめて持つ小さなクラスを一行で作れる仕組みです。attr_accessorinitialize を自分で書かずに済みます。

Point = Struct.new(:x, :y) do
  def distance
    Math.sqrt(x**2 + y**2)
  end
end

p = Point.new(3, 4)
puts p.x          # 3
puts p.distance   # 5.0

Comparable モジュールは、<=>(第39レッスン)を1つ定義するだけで、< > == between? などの比較メソッドをまとめて手に入れられる Mix-in です。

class Version
  include Comparable
  attr_reader :num
  def initialize(num); @num = num; end
  def <=>(other); num <=> other.num; end
end

puts Version.new(1) < Version.new(2)   # true(<=> を書くだけで < が使える)

Bundler と Gemfile は、プロジェクトが使う gem(ライブラリ)とそのバージョンを管理する仕組みです。プロジェクトのルートに Gemfile を置き、bundle install で必要な gem を一括で揃えます。

# Gemfile の例
source "https://rubygems.org"

gem "rails", "~> 7.1"
gem "puma"
gem "rspec", group: :test
$ bundle install     # Gemfile に書いた gem をまとめて導入
$ bundle exec ruby app.rb   # そのプロジェクトの gem 環境で実行

Gemfile.lock には実際に入ったバージョンが記録され、チームの全員がまったく同じライブラリ環境を再現できます。Python の requirements.txtJavaScriptpackage.json と同じ役割です。

まとめ

Ruby コースはここまでです。基礎文法からオブジェクト指向、例外・モジュール、そして実務の記法・メタプログラミング・モダンRubyまで touch しました。

身につけたこと
1〜4変数・型・制御構文・配列・ハッシュ
5〜6メソッド・ブロック・yield・Enumerable
7クラス・継承・attr_accessor
8例外処理・モジュール/Mix-in・gem
9シンボル・多重代入・可変長引数・<=>・名前空間・メタプログラミング・独自例外

次は Ruby on Rails に進むのがおすすめです。この章で学んだシンボル・ハッシュ・モジュール・<=>・メタプログラミングは、Rails のコードのいたるところに登場します。基礎を土台に、作りたいものへ一歩踏み出しましょう。