工藤探偵事務所

Resarch and Investigation

ルビー3分クッキング 第五回「ハッシュをつくろう」の巻

kudo-shunsaku2008-03-30


3分間で覚える Ruby のトピックスです。
でも、本家同様に実際には10分程度掛かります。

大事なのは小さな積み重ねと継続する才能ですね。


第五回は、「ハッシュをつくろう」の巻です。

今回はハッシュです。配列とハッシュは Ruby でのデータ格納方法として基本的な機能であり、また配列とハッシュは相互に密接に関係しています。

Ruby では、組み込みクラスとして「ハッシュ (Hash)」 が用意されています。


配列は、データを添え字(インデクス)付きで、キチンと順番に格納する方法でありました。ハッシュは、「キー (Key)」と「値 (Value)」をペアにしてデータを格納する方法です。

今回は、ハッシュのつくり方から観ていくことにしましょう。

では基本的なハッシュのつくり方をやってみましょう。

ハッシュはハッシュ式と呼ばれる特別な記法があります。

{a=>b, ... }

これをつかうとハッシュがつくれる様です。早速やってみましょう。

ファイル名は、"whats_hash.rb" などとして下さい。

$KCODE="S"

# ハッシュの作り方
basic_seasoning = {"さ"=>"砂糖", "し"=>"塩","す"=>"酢","せ"=>"醤油","そ"=>"味噌"}
p basic_seasoning

puts

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby whats_hash.rb
{"し"=>"塩", "す"=>"酢", "せ"=>"醤油", "そ"=>"味噌", "さ"=>"砂糖"}

C:\rubycode\3minutes2cooking>

ハッシュ式というのがちょっと奇妙に思えるかもしれませんが、Ruby ではそのようにハッシュを表現するようです。
"p" でハッシュ・インスタンスを印字するとハッシュ式で表示されますね。

ところで、このソースコードでは日本語を使っているので「$KCODE="S"」と指定しています。これはソースコードの文字エンコーディングが "Shift_JIS" ですよ、と明示しているのです。日本語の取り扱いについては、またいつかご紹介します。

今度は配列を使ってハッシュをつくってみます。

配列のデータを使って、ハッシュを生成するのには二つの方法があります。

先ほどのソースコードに追加してみます。

# 配列からハッシュをつくる
seasoning_ary = ["さ","砂糖", "し","塩","す","酢","せ","醤油","そ","味噌"]
p seasoning_ary
p basic_seasoning = Hash[*seasoning_ary]

puts

# 配列の配列からハッシュをつくる
seasoning_ary = [["さ","砂糖"], ["し","塩"],["す","酢"],["せ","醤油"],["そ","味噌"]]
p seasoning_ary
p basic_seasoning = Hash[*seasoning_ary.flatten]

puts

# キーと値それぞれの配列からハッシュをつくる、其の壱。
keyword_ary = ["さ", "し","す","せ","そ"]
spice_ary = ["砂糖","塩","酢","醤油","味噌"]
# 配列の配列が出来ます。さっきと同じです。
p seasoning_ary = keyword_ary.zip(spice_ary)  
p basic_seasoning = Hash[*seasoning_ary.flatten] 

puts

# キーと値それぞれの配列からハッシュをつくる、其の弐。
keyword_ary = ["さ", "し","す","せ","そ"]
spice_ary = ["砂糖","塩","酢","醤油","味噌"]
# 配列の配列が出来ます。さっきと同じです。
p seasoning_ary = [keyword_ary, spice_ary].transpose 
p basic_seasoning = Hash[*seasoning_ary.flatten]

puts

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby whats_hash.rb
{"し"=>"塩", "す"=>"酢", "せ"=>"醤油", "そ"=>"味噌", "さ"=>"砂糖"}

["さ", "砂糖", "し", "塩", "す", "酢", "せ", "醤油", "そ", "味噌"]
{"し"=>"塩", "す"=>"酢", "せ"=>"醤油", "そ"=>"味噌", "さ"=>"砂糖"}

[["さ", "砂糖"], ["し", "塩"], ["す", "酢"], ["せ", "醤油"], ["そ", "味噌"]]
{"し"=>"塩", "す"=>"酢", "せ"=>"醤油", "そ"=>"味噌", "さ"=>"砂糖"}

[["さ", "砂糖"], ["し", "塩"], ["す", "酢"], ["せ", "醤油"], ["そ", "味噌"]]
{"し"=>"塩", "す"=>"酢", "せ"=>"醤油", "そ"=>"味噌", "さ"=>"砂糖"}

[["さ", "砂糖"], ["し", "塩"], ["す", "酢"], ["せ", "醤油"], ["そ", "味噌"]]
{"し"=>"塩", "す"=>"酢", "せ"=>"醤油", "そ"=>"味噌", "さ"=>"砂糖"}
C:\rubycode\3minutes2cooking>

配列からハッシュを作る方法の一つは、ハッシュとしたいデータを最初に「キー (Key)」、次に「値 (Value)」として順番並べた配列を用意する方法です。この場合の注意は、キーと値がペアでないとハッシュがつくれないので、必ず偶数個の要素を指定しなければなりません。


もう一つは配列の配列(二次元配列)から作る方法です。配列をハッシュのデータとしたい際に配列の配列であれば、きちんとペアにデータが揃っていることが確認できます。これを "flatten" という配列のメソッドをつかうと平ら(平滑化)にしてくれます。つまり、ただの配列にしてくれます。後は上と同じ容量ですね。


要するに最終的には配列に入っているデータを取り出して、順番にハッシュのデータとして入れていくことになります。

配列とハッシュが蜜月な関係にあることが伺い知れますね。

ではハッシュの利用方法です。

先ほどのソースコードに追加してみます。

p basic_seasoning.fetch("し")
p basic_seasoning["せ"]
p basic_seasoning.values

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby whats_hash.rb
    :
    :

[["さ", "砂糖"], ["し", "塩"], ["す", "酢"], ["せ", "醤油"], ["そ", "味噌"]]
{"し"=>"塩", "す"=>"酢", "せ"=>"醤油", "そ"=>"味噌", "さ"=>"砂糖"}

"塩"
"醤油"
["塩", "酢", "醤油", "味噌", "砂糖"]

C:\rubycode\3minutes2cooking>

ハッシュですと、キーから値を "fetch" メソッド(関数)で取り出せます。

「し」は「塩」です。

また配列と同様に、、ブラケット(bracket, 角括弧)を使った式(配列参照演算子)でキーを指定することも出来ます。

「せ」は「せうゆ」で「醤油」ですね。これよく忘れてしまいますけど。

またハッシュに格納されている値だけの一覧も "values"というハッシュのメソッドで 取り出すことも出来ました。

キーで値を取り出せる構造が便利なときが沢山ありそうですね。

今回はハッシュに挑戦してみました。配列とハッシュは特に重要です。
また折を見てこれらの面白い料理法を探してご紹介したいと想います。





「たらこー♩たらこー♩たっぷり♫たらこー♩」

今日はここまで。次回をお楽しみに。