Rubyの世界へようこそ ~ 配列とハッシュ: データの効率的な管理方法 ~
はじめに
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でのハッシュの活用方法について、理解が深まりましたか?是非、これらのテクニックを実践してみてください!
参考
Discussion