Ruby 天気予報編 (3) Hash の説明 その 1 【計算数学 I】

更新日時:

Ruby の Hash の説明

Ruby のハッシュとは、 Hash クラスのインスタンスです。 ハッシュとは、配列の「添字」を、「インスタンス」にしたものです。 すなわち、数字以外も利用できます。

「インスタンス」は hash() というメソッドが定義されているクラスのインスタンスであればなんでもいいのですが、実用上は「文字列」または「シンボル」が採用されることがほとんどです。これらのクラスでは hash() は用意されていますから作る必要はありません。

ハッシュの「添字」のことを、普通は「キー」といいます。ハッシュの「返り値」のことを、「値」といいますが、あまり使われないと思います。変数でおくときは、慣例上 key, val とすることが多いです。

作り方・アクセスの仕方

早速ハッシュの作り方・アクセスの仕方を説明しましょう。

  • 空のハッシュを作るには {} とする。
    • Hash.new() でも作ることができるが、{}で作るほうが頻度が高い。
  • アクセスには、配列と同様に [] を使う。例えば、ハッシュ hashkey の添字の要素にアクセスするには hash[key] とする。
    • 読み取りだけでなく、生成・代入もできる。 hash[key] = val とする。

ここまでわかると最低限使えるようになります。

uzuki = {}
uzuki[:type] = :Cute
uzuki[:age] = 17
uzuki[:song] = "S(mile)ING!"

後述するように、ハッシュとは、Ruby 固有のデータ構造ではありません。 型が厳密な言語では、返り値の型は揃っていないといけませんが、 Ruby にその必要はありません。上のプログラムはそうなっています。 添字も揃っている必要はないのですが、揃っていないと混乱するので、同じ型(同じクラスのインスタンス)を使用しましょう。

便利な書き方

さて、上述のようにハッシュの「中身」を作っていると、利便性が低くて大変です。 ハッシュを生成する段階で「中身」がわかっている場合には、簡単な書き方があります。

  • ハッシュを {} で生成する際に、 => を使って「中身」を列挙して記述することができる。
    • 具体的には {} の中に key => val と記述する。
    • 列挙する場合は、 , で区切る。
rin = { :type => :Cool,
        :age => 15,
        :song => "Naver say never" }

コンマ , の後に改行は入れる必要はありません。入れてもいいですし、入れなくてもいいです。

Ruby では「改行」という「文字」は意味を持つので、適当なところで不用意に改行しては、プログラムがうまく動作しないかもしれません。しかし 1 行が長くなってくると改行したくなるものかと思います。その場合、以下の部分は、改行してもたいてい問題ないかと思います。

  • (文字列の一部でない)コンマの 直後
  • 2 項演算子の 直後

添字がシンボルの場合

さて、ハッシュを生成する段階で「中身」がわかっている、かつ、添字がシンボルの場合、より便利な書き方があります。

  • ハッシュを {} で生成する際に、 :symbol => keysymbol: key と書ける。
    • コロンやスペースの入れ方に注意。
    • アクセスする際は、普段通り hash[:symbol] のようにする。

サンプルとしては、以下のとおりです。

mio = {
  type: :Passion,
  age: 15,
  song: "ミツボシ☆☆★"
}

上記プログラムは、以下と 全く同じ です。

mio = {
  :type => :Passion,
  :age => 15,
  :song => "ミツボシ☆☆★"
}

余談:この記法は Ruby 1.9 以降で使えます。現在(2017 年 6 月)の最新版の Ruby の version は 2.4 ですから、気にする必要はありません。この記法を理解していないと Rails 4 以上をまともに使うことすらできないでしょう。

プログラムをながめたりコピペして実行したりするのは飽きてきたでしょうから、そろそろ演習しましょう。

演習

実行したときに出力結果が得られるように、以下の空欄を埋めて、プログラムを完成させましょう。

プログラム


# ここを埋める

puts "hiro[:age] = #{hiro[:age]}"
puts "hiro[:song] = #{hiro[:song]}"
puts "hiro[:jump] = #{hiro[:jump]}"

出力

hiro[:age] = 16
hiro[:song] = Pride
hiro[:jump] = 絶対アイドル☆愛・N・G

ナビゲーション

この教材は、東京大学理学部数学科専門科目「計算数学 I」のために執筆されたものです。 このサイトに掲載する際に、記事を分けてあります。 他の回はRuby 天気予報編 一覧 #ks1-ruby-forecastから御覧ください。

Ruby 入門 (計算数学実習資料集)には他の TA が書いた教材があります。

コメントする