「Ruby/Rails Advent Calendar 2025」の23日目の記事です!
qiita.com
先日、Ruby リリース30周年パーティに参加してきたのですが、歴代リリースマネージャの方の座談会、Ruby の未来の話など Ruby に関わるたくさんの方の話を伺うことができてとても充実した時間を過ごすことができました。
Ruby というプログラミング言語も、そのコミュニティも大好きな自分ですが、今回の記事では「私の好きな Ruby の変数代入 Tips」と題して、3つの方法に触れたいと思います。
partition で「意味のある2つ」に分ける
一つ目は Enumerable#partition メソッドです。
docs.ruby-lang.org
プログラムを書いていると、配列をある条件で2つに分けて扱いたくなることがよくありませんか。
partition は、ブロックで定義した条件の結果を2つの配列としてそのまま変数に受け取ることができる便利なメソッドです。
EC サイトのクーポンの有効期限を例に使い方を見てみたいと思います。
today = Date.new(2025, 12, 23)
coupons = [
{ code: 'COUPON_1', expires_on: Date.new(2025, 12, 10) },
{ code: 'COUPON_2', expires_on: Date.new(2025, 12, 25) },
{ code: 'COUPON_3', expires_on: Date.new(2025, 11, 15) },
{ code: 'COUPON_4', expires_on: Date.new(2026, 1, 1) }
]
active_coupons, expired_coupons = coupons.partition { it[:expires_on] >= today }
pp active_coupons
pp expired_coupons
こんな感じで「何を基準に分けているのか」がコードから自然に読み取れるところが好きです。
values_at でハッシュや配列から必要な値だけを受け取る
2つ目は Hash#values_at です。
docs.ruby-lang.org
docs.ruby-lang.org
Rails の params から複数の値を取り出す際にとてもよく使います。
values_at は、引数で指定したキーに対応する値の配列を返します。そのため、分割代入を使って結果を個々の変数として受け取ることができます。
params = {variant: "りんご", origin: "青森県", producer: "Ruby 農園", price: 230}
variant, origin, price = params.values_at(:variant, :origin, :price)
variant
origin
price
また、配列のインデックスを指定して値を取り出せるため、分割代入で不要な値を _ のように書かずに済みます。
row = ["001", "maimu", "maimu@example.com", "東京都", "03-1234-5678"]
id, name, tel = row.values_at(0, 1, 4)
id
name
tel
パターンマッチで右代入風に値を取り出す
3つ目はパターンマッチの => を使って右代入風に値を取り出す方法です。
この記事では、変数代入の Tips としてパターンマッチを紹介しています。パターンマッチ自体は代入に限らず、条件分岐などでも使える汎用的な機能です。
docs.ruby-lang.org
Ruby/Rails Advent Calendar 2025の17日目の記事で sanfrecce_osaka もパターンマッチについて書かれています!
zenn.dev
そもそも、右代入とは?右代入風とは?という点についてまず触れたいと思います。
hash = { foo: 1, bar: 2, baz: 3 }
このようなハッシュがあって、一つ目の値を変数に入れたいとします。
普通に書くとこうなると思います。
foo = hash[:foo]
foo
これをパターンマッチの => を使って書き換えることができます。
hash = { foo: 1, bar: 2, baz: 3 }
hash => { foo: }
foo
右代入のイメージが持てたでしょうか?
次に「右代入風」と書いていることについてです。上の例のように見た目は「右代入」のように使えるのですが、内部的にはパターンマッチの照合が行われています。そのため、マッチしない場合は例外が発生します。代入ではなくマッチングであるため、「右代入風」と表現しています。
hash = { foo: 1, bar: 2, baz: 3 }
hash => { piyo: }
パターンマッチではなく通常の代入を使うと例外ではなく、値が nil になります。
piyo = hash[:piyo]
piyo
パターンマッチによる代入はハッシュのネストが深くなった時により便利さを実感できます。
user = {
name: 'Alice',
profile: {
age: 10,
address: 'Wonderland'
}
}
パターンマッチを使わない場合はこうですね。
address = user[:profile][:address]
address
パターンマッチを使う場合は以下のように書くことができます。
user => { name:, profile: { address: } }
address
初めて見ると一瞬「なんだこれは・・・?」と思ってしまいそうですが、動きがわかると普段の実装にも活用できるシーンは色々ありそうです。
私はパターンマッチを使うことで期待している構造を前提にシンプルにコードを書ける点が気に入っています。
まとめ
私の好きな Ruby の変数代入 Tips として、partition 、values_at、パターンマッチの => を使う方法について書いてみました。
何をしたいかやデータの構造に応じて使い分けて、これからもたくさん Ruby でプログラムを実装していきたいと思います!