【Ruby】配列とハッシュ〜Keishiの引越し物語〜

#はじめに
プログラミング初心者のつまづきポイントである**【配列】**と**【ハッシュ】**。
当記事では「Keishiの引越し物語」を通して、これらの特徴や違いをまとめます。
また、最後に物語をRubyコードにあてはめるとどうなるのかも見てみましょう。

:warning:<font color="MediumVioletRed">当記事では、分かりやすさ優先のため、サンプルコードで変数名などに日本語を使用しています。本来は英語表記が定石ですので、ご注意お願いいたします。</font>

#環境

* macOS BigSur Ver11.2.3
* Ruby 2.6.5.

#用語説明


当記事では、配列とハッシュを理解していただくために、
各用語を「Keishiの引越し物語」でイメージしながら解説していきます。

**＜物語中の例え＞**
* 段ボール　⇨　**配列（①）**
* 生活用品や服などのモノ　⇨　**オブジェクト（②）**
* 思い出のおもちゃをしまうアルミ缶　⇨　**子要素としての配列（③）**
* コードダス　⇨　**ハッシュ（④）**

さっそく解説に入りましょう！

####①「配列」ってなに？
>**【第１話】**
Keishiはめでたく、コプセルコーポレーションにエンジニア就職が決まり、西の都に引越し予定。いつものように調子に乗って前日まで準備をおサボりして、大慌て。しょうがないので、仕分けは諦めて段ボールにブチ込むことにしました。

配列とは、色々なモノを格納できる「箱」のようなモノです。
ここではモノを詰める「段ボール」が配列ですね。

![スクリーンショット 2021-05-19 18.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1345096/70c0e6df-2110-8ca2-1b2a-210724639402.png)

段ボールには何でも入ります。
生活用品や服などのモノ（オブジェクト）はもちろん、
おもちゃを集めたアルミ缶ケースも。
整理するかどうかもあなた次第。

このように、**何でも入る便利な「箱」のことを、配列と言います**。

####②「オブジェクト」ってなに？
>**【第2話】**
Keishiはとりあえず、生活用品や服などの「モノ」を手当たり次第にブチこんでいます。


オブジェクトとはなにか？
本当は「役割」とか色々ありますけど、
**まずは大雑把に「モノ」のことだと思ってください。**

ここでは「生活用品や服などのモノ」のことですね。

![スクリーンショット 2021-05-19 18.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1345096/71fff9e3-2ad3-f2ec-d2b8-255f00986d00.png)


補足すると、**「オブジェクトが入った配列」もオブジェクトの一つ**です。
この点は③で理解しましょう。

####③「子要素としての配列」ってなに？

>**【第3話】**
Keishiは少年のままなので、思い出のおもちゃ（温たまごっちや骨消し）を捨てられません。引越し先に持っていきたいのですが、段ボールは大きすぎるので、アルミ缶にしまいました。そしてそのアルミ缶を、思い出とともにそっと段ボールにしまいました。

配列は「箱」です。
**実は箱の中には、さらに箱を入れることも可能**なのです。

「箱の中にある箱」を**子要素としての配列**といいます。
子要素があるということは、親要素もありますね。
「箱をしまう箱」を**親要素としての配列**といいます。

![スクリーンショット 2021-05-19 18.05.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1345096/cfed8d01-e6cc-2c84-0e96-49b34af4684f.png)

ここでは、
「アルミ缶ケース」が子要素としての配列、
「段ボール」が親要素としての配列
ですね。

ここまでで、配列とオブジェクトの感覚は掴めたと思います。
では、「ハッシュ」とはなんでしょうか？

####④「ハッシュ」ってなに？
>Keishiは無事におもちゃをアルミ缶にしまいましが、新しい問題発生です。
「ドラゴンボールX」のコードダスも持っていきたいのですが、
コードは付番されており、アルミ缶の中にごちゃ混ぜに入れるのは、
コレクターとして非常に抵抗があります。（こーいうところだけ几帳面です）
そこでKeishiは、「コードダスアルバム」にコードを整理して収納しました。
これでコードNoも、キャラクターもわかりやすくなりました。

ここではそれぞれ、以下のように該当します。

* コードダスアルバム　→ 配列
* コード　→ 変数
* 掲載情報（カードNoやキャラクターなど）　→ **【ハッシュ】**
* 「キャラクター」「BP（戦闘力）」などの属性名　→ **【キー】**
* 「フリーゾ」「530000」などの属性値　→ **【バリュー】**

なんだか新しいワードが出てきましたね。
実はハッシュを理解するためには、新しいワードを理解する必要があります。
この記事を読んでいる方は「変数」は理解されていると思うので、その他を説明します。

コードを「変数」とした場合、
掲載されている情報（属性名＆属性値）のまとまりを**【ハッシュ】**といいます。

ハッシュの中身をさらに細かく見てみましょう。
属性名のことを**【キー】**、属性値のことを**【バリュー】**といいます。

![スクリーンショット 2021-05-19 18.07.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1345096/b361dcbf-0c59-528e-8f11-6f8d8e74c8a1.png)

ハッシュ（キーとバリューの組み合わせ）を変数に格納し、
今度は変数を配列の中に格納することを繰り返すことで、
整理整頓された配列を生み出すことができるわけですね。

引越し物語の世界では、コードのハッシュはあらかじめ集***社によって
記述（格納）されていますが、Keishiはそのハッシュを利用して整理整頓した状態で
コードダスアルバムという配列に格納していったわけですね。

>**【最終話】**
Keishiは段ボールの中身を確認し、必要なもの全てあるとわかりました。
ギリギリで引越し準備を終わったようですね(ギューニュー引越しセンターさん到着10分前)。
何とか無事に、コプセルコーポレーションでブルモのもとで、エンジニアとして働き始めていけそうですね。
めでたしめでたし。

#Rubyコードサンプル
```ruby
#【第1話】
#まずは空の段ボール（配列）を用意
danbouru = []

#【第2話】
#とにかくモノ（オブジェクト）をブチ込みます
danbouru << "生活用品"
danbouru << "(戦闘)服"

#【第３話】
# 思い出のおもちゃをしまうアルミ缶（子要素としての配列）を用意
arumi_kan = []

#温たまごっちと骨消しをアルミ缶に収納
arumi_kan << "温たまごっち"
arumi_kan << "骨消し"

#段ボール（親要素としての配列）に、アルミ缶（子要素としての配列）を思い出とともにそっとしまう
danbouru << arumi_kan

#【第4話】
#コードダスアルバム（配列）を用意
code_dasu_album = []

#コードダスアルバムに収納するカード（変数）を用意。
#コード（変数）には、集***社が情報を記述済み
code_1 = {number: 1, character: "孫母空(才王拳)", BP: 180000, quote: "はっきり言っておくぞ、瞬間的に出せる力はまだまだこんなもんじゃねぇ！"}
code_2 = {number: 2, character: "フリーゾ(第1形態)", BP: 530000, quote: "私の戦闘力は53万です"}

#コードダスアルバム（配列）にコードダス（変数）を収納
code_dasu_album << code_1
code_dasu_album << code_2

#コードダスアルバム（子要素としての配列）を段ボール（親要素としての配列）に収納
danbouru << code_dasu_album

#【最終話】
#段ボールの中身を確認
puts danbouru

#＜実行結果＞
#生活用品
#(戦闘)服
#温たまごっち
#骨消し
#{:number=>1, :character=>"孫母空(才王拳)", :BP=>180000, :quote=>"はっきり言っておくぞ、瞬間的に出せる力はまだまだこんなもんじゃねぇ！"}
#{:number=>2, :character=>"フリーゾ(第1形態)", :BP=>530000, :quote=>"私の戦闘力は53万です"}
```