カテゴリ: Ruby 更新日: 2026/01/22

Rubyハッシュの応用ガイド!updateメソッドと**(ダブルアスタリスク)の活用術

まとめて更新:update・**(キーワード展開)・構造的代入のコツ
まとめて更新:update・**(キーワード展開)・構造的代入のコツ

先生と生徒の会話形式で理解しよう

生徒

「Rubyで複数のデータをまとめて管理するハッシュを使っていますが、一度にたくさんのデータを書き換えたり、別のハッシュと合体させたりする方法はありますか?」

先生

「ありますよ! update というメソッドを使えば、ハッシュ同士を簡単に統合できます。さらに ** という記号を使った面白いテクニックもあるんです。」

生徒

** って、掛け算みたいな見た目ですね。どうやって使うんですか?」

先生

「これはキーワード展開といって、ハッシュの中身をバラバラにして広げるようなイメージです。構造的代入という便利なコツと一緒に学んでいきましょう!」

1. ハッシュを「まとめて更新」する魅力とは?

1. ハッシュを「まとめて更新」する魅力とは?
1. ハッシュを「まとめて更新」する魅力とは?

Rubyのハッシュ(Hash)を操作していると、一つの値だけでなく、複数の項目を一度に更新したい場面が出てきます。例えば、ユーザーのプロフィール情報の中で「年齢」と「住所」を同時に変更する場合などです。

一つずつ書き換えることもできますが、データが増えるとプログラムが長くなり、書き間違いの原因にもなります。そこで、複数のデータを一つの塊(オブジェクト)として扱い、ガシャンと合体させる「まとめて更新」の技術が重要になります。これにより、コードがスッキリして読みやすくなるだけでなく、プログラミングの効率が格段に上がります。

2. updateメソッドでハッシュを統合する

2. updateメソッドでハッシュを統合する
2. updateメソッドでハッシュを統合する

複数のハッシュを一つにまとめる最も代表的な方法が update メソッドです。これは「既存のハッシュに、別のハッシュの内容を上書き合体させる」という命令です。パソコンのフォルダを上書きコピーする感覚に近いですね。

ちなみに、Rubyには同じ機能を持つ merge! という名前のメソッドもありますが、どちらを使っても同じ結果が得られます。初心者の方は、直感的に分かりやすい「アップデート」という名前で覚えておくと良いでしょう。


# 現在のユーザー情報
user = { name: "田中", age: 20 }

# 新しく届いた更新データ
new_data = { age: 21, address: "東京都" }

# userをnew_dataで更新する
user.update(new_data)

puts user

実行結果は次のようになります。


{:name=>"田中", :age=>21, :address=>"東京都"}

もともとあった age21 に書き換わり、存在しなかった address は新しく追加されています。このように、重複する部分は上書きし、新しい部分は追加してくれるのが update の便利な点です。

3. **(ダブルアスタリスク)とキーワード展開

3. **(ダブルアスタリスク)とキーワード展開
3. **(ダブルアスタリスク)とキーワード展開

次に、少し不思議な記号 ** (ダブルアスタリスク)について解説します。これはプログラミング用語で「キーワード展開」や「スプラット演算子」などと呼ばれます。難しい名前ですが、役割は簡単です。ハッシュを包んでいる「外側の殻」を破って、中身の具材をバラバラに広げる役割を持っています。

これを使うと、新しいハッシュを作る際に、別のハッシュの中身をそのまま流用することができます。封筒(ハッシュ)の中に入っている手紙(データ)を取り出して、新しい封筒に入れ直すようなイメージです。


# 基本の設定
default_config = { theme: "dark", font_size: 14 }

# 基本の設定を引き継ぎつつ、一部を変えた新しいハッシュを作る
# ** を使うことで中身を展開している
my_config = { **default_config, font_size: 18, location: "Japan" }

puts my_config

実行結果は以下の通りです。


{:theme=>"dark", :font_size=>18, :location=>"Japan"}

default_config の中身をコピーしつつ、 font_size だけを 18 に上書きした新しいハッシュが作られました。元の default_config は壊さずに、新しいデータを作りたいときに非常に役立ちます。

4. メソッドの引数で活躍するキーワード展開

4. メソッドの引数で活躍するキーワード展開
4. メソッドの引数で活躍するキーワード展開

この ** は、自分で作った命令(メソッド)にデータを渡すときにも大活躍します。たくさんの設定項目がある場合、一つひとつバラバラに渡すのは大変ですが、ハッシュにまとめて ** をつけて渡すと、Rubyが自動的に適切な場所へ振り分けてくれます。

これを「キーワード引数への展開」と呼びます。受け取る側が「どの名前のデータが欲しいか」を決めている場合、ハッシュのキーの名前が一致していれば、順番を気にせずに正確にデータが届きます。まるで、宛名が書いてある荷物を自動仕分け機にかけるような仕組みです。

5. 構造的代入(パターンマッチング)の基本

5. 構造的代入(パターンマッチング)の基本
5. 構造的代入(パターンマッチング)の基本

最近のRuby(バージョン3.0以降)では、ハッシュから特定のデータを取り出す際に「構造的代入」という高度な技が使えるようになりました。これは、ハッシュの形(構造)を指定して、その中身を直接変数に代入する方法です。

今までは name = user[:name] のように一行ずつ書く必要がありましたが、構造的代入を使えば、まるでジグソーパズルの型をはめるように、一気にデータを取り出すことができます。複雑なデータ構造の中から、必要な情報だけを「抜き取る」感覚です。


# 商品のデータ
item = { id: 101, name: "ノートPC", price: 50000 }

# 構造を合わせてデータを取り出す(パターンマッチングの応用)
case item
in { name: n, price: p }
  puts "商品名は#{n}、価格は#{p}円です"
end

実行結果は次のようになります。


商品名はノートPC、価格は50000円です

このように、ハッシュのキーを指定するだけで、その値を自動的に変数 np に入れてくれるのです。これを使いこなすと、データ処理のコードが驚くほど短く、そして直感的になります。

6. 似ているようで違う!updateと展開の使い分け

6. 似ているようで違う!updateと展開の使い分け
6. 似ているようで違う!updateと展開の使い分け

「ハッシュを合体させる」という点では update{ **hash } も似ていますが、大きな違いがあります。それは「元のデータを書き換えるかどうか」です。

update は、元のハッシュそのものを書き換えてしまいます。これをプログラミングでは「破壊的な操作」と言います。一方、 ** を使って新しい {} の中で展開する方法は、元のハッシュはそのままに、新しい別のハッシュを作り出します(非破壊的な操作)。

元のデータを後でまた使う予定があるなら ** を使い、使い終わったデータを最新の状態に更新して保持し続けたいなら update を使うのがプロのコツです。この使い分けができるようになると、予期せぬデータの変化によるバグ(プログラムのミス)を防ぐことができます。

7. 実践的なデータの「お掃除」テクニック

7. 実践的なデータの「お掃除」テクニック
7. 実践的なデータの「お掃除」テクニック

プログラミングの実践では、不完全なデータにデフォルト(標準)の値を継ぎ足す「お掃除」のような作業がよくあります。ここでも今回の技術が役立ちます。例えば、ユーザーが入力しなかった項目を標準値で埋めるような処理です。


# 標準の設定
defaults = { volume: 50, repeat: false, shuffle: true }

# ユーザーが変更した設定
user_input = { volume: 80 }

# 標準設定の上にユーザーの入力を重ねる
# 順番が大事!後から書いたものが優先される
final_settings = { **defaults, **user_input }

puts final_settings

実行結果は以下のようになります。


{:volume=>80, :repeat=>false, :shuffle=>true}

このように展開を重ねることで、不足している情報を補いつつ、変更したい部分だけを変えた完璧なデータを作ることができます。これはWebアプリの設定画面などで非常によく使われるテクニックです。

8. 未経験者が意識すべき「データの流れ」

8. 未経験者が意識すべき「データの流れ」
8. 未経験者が意識すべき「データの流れ」

パソコンを初めて触る方にとって、目に見えない「データ」がどう動いているかを想像するのは難しいかもしれません。しかし、今回学んだ update** は、すべて「情報の整理整頓」のための道具です。

ハッシュはバラバラな情報を束ねる「輪ゴム」、 update は情報を書き足す「ペン」、 ** は中身を広げる「レジャーシート」だと考えてみてください。これらの道具を組み合わせることで、複雑な情報も迷子にならずに扱えるようになります。まずは update で二つのハッシュをくっつけるところから、一歩ずつ試してみましょう。

カテゴリの一覧へ
新着記事
New1
Ruby
“すべてはオブジェクト”を体感!初心者向けRubyのオブジェクト指向入門【irbで学ぶ】
New2
Ruby
Rubyの標準入出力を完全ガイド!puts・print・pの違いとデバッグ活用法
New3
Ruby
Gemとは?RubyGemsとBundlerを初心者向けに完全解説!依存関係管理も図解でわかりやすく理解
New4
Ruby
Rubyの文字エンコーディング入門!UTF-8・マジックコメント・外部/内部エンコーディングを完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.7
Java&Spring記事人気No7
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説