💎

Rubyの世界へようこそ ~ 配列とハッシュ: データの効率的な管理方法 ~

2024/02/29に公開

はじめに

  Paizaの問題集を解いたり、フレームワークを使用したりしていると、「ハッシュについて、私自身の理解が足りていない」と感じたので、まとめることにしました。

配列とは

  配列とは、1つの変数の中に複数のデータを持つことのできるデータ型のことです。通常の変数と比べて、以下のような特徴があります。

  • 通常の変数には、値は1つしか入れることができない。
  • 変数を配列として定義すれば、複数のデータをまとめて入れることができる。
noodle = "ラーメン"
puts noodle
# 出力結果:ラーメン

# 配列
noodles = ["醤油ラーメン", "塩ラーメン", "とんこつラーメン"]
puts noodles
# 出力結果:醤油ラーメン
#          塩ラーメン
#         とんこつラーメン

キー(添え字)

  配列の中は、以下のように「キー」と「値」がセットになっています。

キー
0 ジョナサン・ジョースター
1 ジョセフ・ジョースター
2 空条承太郎

変数という大きな箱のそれぞれの引き出しに、番号が付いた状態でしまわれているようなイメージです。

キーは「添え字」とも呼ばれます。

通常の配列では、キーを入れた順番に、「0」から連番が振られます。そのため、キーの番号を利用して、取り出したい値を選択することもできます。

# 連番が振られるので、値のみ記述
character_names = [
  "ジョナサン・ジョースター", #=> キー:0
  "ジョセフ・ジョースター",   #=> キー:1
  "空条承太郎"               #=> キー:2
]

puts character_names[1]     #=>キーが1の値を出力
# 出力結果:ジョセフ・ジョースター

ハッシュとは

  ハッシュとは、それぞれのキーに、連番ではなく分かりやすい名前を付けた配列のことです。連想配列とも呼びます。

キー
name 空条承太郎
stand スタープラチナ
character_info = {
  name: "空条承太郎",
  stand: "スタープラチナ"
}

puts character_info[:stand] #=>キーがstandの値を出力
# 出力結果:スタープラチナ

ハッシュ in ハッシュ

以下のように、ハッシュの中にハッシュを持つこともできます。

# ハッシュ in ハッシュ
character_info = {
  name: "空条承太郎",
  stand: "スタープラチナ",
  words: {
    attack: "オラオラオラオラオラオラ",   # ハッシュinハッシュ
    finish: "やれやれだぜ"
  }
}
puts character_info[:name]            # => "空条承太郎"
puts character_info[:stand]           # => "スタープラチナ"
puts character_info[:words][:attack]  # => "オラオラオラオラオラオラ"
puts character_info[:words][:finish]  # => "やれやれだぜ"

上のコードを、全て「配列」で持つ(配列 in 配列)こともできます。

# 配列 in 配列
character_info = [
  ["name", "空条承太郎"],
  ["stand", "スタープラチナ"],
  ["words", [
    ["attack", "オラオラオラオラオラオラ"],    #配列in配列
    ["finish", "やれやれだぜ"]
  ]]
]

puts character_info[0][1]             # => "空条承太郎"
puts character_info[1][1]             # => "スタープラチナ"
puts character_info[2][1][0][1]       # => "オラオラオラオラオラオラ"
puts character_info[2][1][1][1]       # => "やれやれだぜ"

  2つのコードを見比べて、どのような印象を受けましたか?どちらのコードの方が、初めて読んだときに1回で理解できそうなコードだと感じましたか?

  出力結果はどちらも同じですが、全てを配列にした場合、キーの連番を使って選択するので、「いま、私は何を呼び出しているのか…」と混乱してしまいます。

  コードは「自分以外の人が読んだ時でも、読みやすい状態にする」ことが大切です。可読性向上のためにも、配列とハッシュを使い分けることができるとよいでしょう。

- おまけ -

2つのハッシュデータを配列としてもつこともできます

# キャラクター情報を配列で保持する
character_info = []

# 空条承太郎の情報を追加
jotaro_info = {
  name: "空条承太郎",
  stand: "スタープラチナ",
  words: {
    attack: "オラオラオラオラオラオラ",
    finish: "やれやれだぜ"
  }
}
character_info << jotaro_info

# DIOの情報を追加
dio_info = {
  name: "DIO",
  stand: "ザ・ワールド",
  words: {
    attack: "無駄無駄無駄無駄無駄無駄",
    finish: "最高に「ハイ!」ってやつだアアアアア"
  }
}
character_info << dio_info

# 各キャラクターの情報を出力
character_info.each do |character|
  puts "#{character[:name]}の情報:"
  puts "名前: #{character[:name]}"
  puts "スタンド: #{character[:stand]}"
  puts "攻撃: #{character[:words][:attack]}"
  puts "決め台詞: #{character[:words][:finish]}"
  puts "------------------"
end

# 出力結果
空条承太郎の情報:
名前: 空条承太郎
スタンド: スタープラチナ
攻撃: オラオラオラオラオラオラ
決め台詞: やれやれだぜ
------------------
DIOの情報:
名前: DIO
スタンド: ザ・ワールド
攻撃: 無駄無駄無駄無駄無駄無駄
決め台詞: 最高に「ハイ!」ってやつだアアアアア
------------------

ハッシュが使われる場面(発展)

  私が学習中のフレームワークRuby on Railsでも、ハッシュ(キーがシンボルになったもの)がよく使われています。

class UsersController < ApplicationController

    # 省略

    def create
        @post = Post.new(post_params)
            if @post.save
            redirect_to @post
        else
            render :new #<=
        end
    end

    # 省略

    def update
        @post = Post.find(params[:id]) #<=
        if @post.update(post_params)
            redirect_to @post
        else
            render :edit #<=
        end
    end

  private

    def post_params
        params.require(:post).permit(:title, :body) #<=
    end
end

まとめ

  今回は、Rubyの世界でのデータの効率的な管理方法について学びました。配列とハッシュを使い分けることで、コードをより読みやすく、効率的に構築することができます。以下に、学んだポイントを振り返りましょう。

  • 配列とは:
    • 複数のデータを1つの変数に格納するデータ型。
    • インデックス番号(キー)を使用して要素を取り出す。
  • ハッシュとは:
    • キーと値のペアでデータを管理するデータ構造。
    • キーを使用して値を取り出す。
  • ハッシュの使い方:
    • キーと値をコロン(:)で関連付け、波括弧({})で囲んで表現する。
  • ハッシュの利点:
    • キーを使用することで、データに意味を持たせ、可読性を向上させる。
    • ハッシュ内にさらにハッシュを入れ子にすることで、複雑なデータ構造を表現できる。

  また、Railsフレームワークでは、ハッシュが頻繁に使用されます。特に、コントローラーでのストロングパラメータの定義やビューでのオプションの指定などで活用されます。

 この知識を活かして、より効率的なコードを書き、読みやすいアプリケーションを構築しましょう。

 さて、あなたは今回の内容をどのように感じましたか?配列とハッシュの使い分けや、Railsでのハッシュの活用方法について、理解が深まりましたか?是非、これらのテクニックを実践してみてください!

参考

https://blog.senseshare.jp/associative-array.html#index1

https://techplay.jp/column/569

Discussion