#はじめに
プログラミング初心者のつまづきポイントである**【配列】と【ハッシュ】**。
当記事では「Keishiの引越し物語」を通して、これらの特徴や違いをまとめます。
また、最後に物語をRubyコードにあてはめるとどうなるのかも見てみましょう。
当記事では、分かりやすさ優先のため、サンプルコードで変数名などに日本語を使用しています。本来は英語表記が定石ですので、ご注意お願いいたします。
#環境
- macOS BigSur Ver11.2.3
- Ruby 2.6.5.
#用語説明
当記事では、配列とハッシュを理解していただくために、
各用語を「Keishiの引越し物語」でイメージしながら解説していきます。
<物語中の例え>
- 段ボール ⇨ 配列(①)
- 生活用品や服などのモノ ⇨ オブジェクト(②)
- 思い出のおもちゃをしまうアルミ缶 ⇨ 子要素としての配列(③)
- コードダス ⇨ ハッシュ(④)
さっそく解説に入りましょう!
####①「配列」ってなに?
【第1話】
Keishiはめでたく、コプセルコーポレーションにエンジニア就職が決まり、西の都に引越し予定。いつものように調子に乗って前日まで準備をおサボりして、大慌て。しょうがないので、仕分けは諦めて段ボールにブチ込むことにしました。
配列とは、色々なモノを格納できる「箱」のようなモノです。
ここではモノを詰める「段ボール」が配列ですね。
段ボールには何でも入ります。
生活用品や服などのモノ(オブジェクト)はもちろん、
おもちゃを集めたアルミ缶ケースも。
整理するかどうかもあなた次第。
このように、何でも入る便利な「箱」のことを、配列と言います。
####②「オブジェクト」ってなに?
【第2話】
Keishiはとりあえず、生活用品や服などの「モノ」を手当たり次第にブチこんでいます。
オブジェクトとはなにか?
本当は「役割」とか色々ありますけど、
まずは大雑把に「モノ」のことだと思ってください。
ここでは「生活用品や服などのモノ」のことですね。
補足すると、「オブジェクトが入った配列」もオブジェクトの一つです。
この点は③で理解しましょう。
####③「子要素としての配列」ってなに?
【第3話】
Keishiは少年のままなので、思い出のおもちゃ(温たまごっちや骨消し)を捨てられません。引越し先に持っていきたいのですが、段ボールは大きすぎるので、アルミ缶にしまいました。そしてそのアルミ缶を、思い出とともにそっと段ボールにしまいました。
配列は「箱」です。
実は箱の中には、さらに箱を入れることも可能なのです。
「箱の中にある箱」を子要素としての配列といいます。
子要素があるということは、親要素もありますね。
「箱をしまう箱」を親要素としての配列といいます。
ここでは、
「アルミ缶ケース」が子要素としての配列、
「段ボール」が親要素としての配列
ですね。
ここまでで、配列とオブジェクトの感覚は掴めたと思います。
では、「ハッシュ」とはなんでしょうか?
####④「ハッシュ」ってなに?
Keishiは無事におもちゃをアルミ缶にしまいましが、新しい問題発生です。
「ドラゴンボールX」のコードダスも持っていきたいのですが、
コードは付番されており、アルミ缶の中にごちゃ混ぜに入れるのは、
コレクターとして非常に抵抗があります。(こーいうところだけ几帳面です)
そこでKeishiは、「コードダスアルバム」にコードを整理して収納しました。
これでコードNoも、キャラクターもわかりやすくなりました。
ここではそれぞれ、以下のように該当します。
- コードダスアルバム → 配列
- コード → 変数
- 掲載情報(カードNoやキャラクターなど) → 【ハッシュ】
- 「キャラクター」「BP(戦闘力)」などの属性名 → 【キー】
- 「フリーゾ」「530000」などの属性値 → 【バリュー】
なんだか新しいワードが出てきましたね。
実はハッシュを理解するためには、新しいワードを理解する必要があります。
この記事を読んでいる方は「変数」は理解されていると思うので、その他を説明します。
コードを「変数」とした場合、
掲載されている情報(属性名&属性値)のまとまりを**【ハッシュ】**といいます。
ハッシュの中身をさらに細かく見てみましょう。
属性名のことを**【キー】、属性値のことを【バリュー】**といいます。
ハッシュ(キーとバリューの組み合わせ)を変数に格納し、
今度は変数を配列の中に格納することを繰り返すことで、
整理整頓された配列を生み出すことができるわけですね。
引越し物語の世界では、コードのハッシュはあらかじめ集***社によって
記述(格納)されていますが、Keishiはそのハッシュを利用して整理整頓した状態で
コードダスアルバムという配列に格納していったわけですね。
【最終話】
Keishiは段ボールの中身を確認し、必要なもの全てあるとわかりました。
ギリギリで引越し準備を終わったようですね(ギューニュー引越しセンターさん到着10分前)。
何とか無事に、コプセルコーポレーションでブルモのもとで、エンジニアとして働き始めていけそうですね。
めでたしめでたし。
#Rubyコードサンプル
#【第1話】
#まずは空の段ボール(配列)を用意
danbouru = []
#【第2話】
#とにかくモノ(オブジェクト)をブチ込みます
danbouru << "生活用品"
danbouru << "(戦闘)服"
#【第3話】
# 思い出のおもちゃをしまうアルミ缶(子要素としての配列)を用意
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万です"}