ハッシュやシンボルを理解する
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る
今日も続きをやっていきます。 ハッシュやシンボルをやっていきます。Rubyのコードだとよく見るけどよく意味がわかっていないところです。 一つ一つ見ていきましょう。
ハッシュ
Rubyのハッシュは、キーと値の組合せでデータを管理するオブジェクトのことです。 他の言語ではディクショナリ(Python)などと呼ばれている。
ハッシュの形は様々だが、基本的には下記のような形になっている。
{ キー => 値1,キー2 => 値2,キー3 => 値3 }
同じキーが複数出てきた場合は、最後に出てきたもののみが有効になる。
ハッシュに要素を追加したい
後から新しいキーと値を追加する場合は次のような構文を使う
ハッシュ[キー] = 値
取り出す場合は次のようにする
ハッシュ[キー]
存在しないキーを取り出すとnilがかえる。
ハッシュを使って繰り返し処理をする
Rubyのハッシュを使ってする繰り返しの処理は、配列と比べて少々注意が必要。
ブロック引数は2つになる。
currencies = {‘japan’ => ‘yen’, ‘us’ => ‘dollar’, ‘india’ =>’rupee’} currencies.each do |key,value| puts “#{key}:#{value}” end
シンボルについて
:シンボルの名前
シンボルの見た目はRubyの文字列によく似ている。
ただし、シンボルはSymbolクラス、文字列はStringクラスになります。 また、シンボルはイミュータブルなので容易に変更されたら困る時に使います。
まとめると次のような長所がシンボルにはあります。
- 表面上は文字列っぽいので、プログラマにとって理解しやすい
- 内部的には整数なので、コンピュータは高速に値を比較できる
- 同じシンボルは同じオブジェクトであるため、メモリの使用効率が良い
- イミュータブルなので、勝手に値を書き換えられることも少ない。
ハッシュのキーにシンボルを使う
実はハッシュのキーにシンボルを使うことができる。
# ハッシュのキーをシンボルにする currencies = {:japan => 'yen', :us => 'dollar', :india => 'rupee'} # シンボルを使って値を取り出す currencies[:us] #=> 'dollar' # 新しいキーと値の組合せを追加する currencies[:italy] => 'euro'
また下記のような書き方もできる。ぜひ覚えておきたい。
# =>ではなく、"シンボル:値"の記法でハッシュに追加する currencies = {japan: 'yen', us: 'dollar', india: 'rupee'} # 値を取り出すときは同じ currencies[:us] #=> 'dollar'
また、キーも値もシンボルにすることができる
{ japan: :yen, us: :dollar, india: :rupee}
メソッドとシンボル
メソッドに引数を渡す場合、どの引数がどんな意味を持つか分かりづらい時があります。こんな時もシンボルとハッシュは役に立ちます。
def buy_burger(menu, drink, potato) #ハンバーガーを購入 if drink # ドリンクを購入 end if potato # ポテトを購入 end end # チーズバーガーとドリンクとポテトを購入する buy_burger('cheese',true,true) # フィッシュバーガーとドリンクを購入 buy_burger('fish',true,true)
これだと何がtrueなのか分かりづらい上に、一々引数に値を代入するのが面倒です。
そんなときは下記のケースを適用することができます。
def メソッド名(キーワード引数1: デフォルト値1, キーワード引数2: デフォルト値2) # メソッドの実装 end
そうすると先ほどのメソッドは、下記のように実装することができる。
buy_burger('cheese',drink: true,potato: true) buy_burger('fish', drink: true,potato: false)
また、あらかじめデフォルト値が設定されてるので、引数を省略することも可能だ。
buy_burger('fish',drink: false)
ただし、存在しないキーワードを引数に指定するとエラーが起きます。
よく使うメソッド
ここでは、よく見るけどよく意味のわからないメソッドを紹介します。
keysメソッド
keysメソッドは、ハッシュのキーを配列として返します。
valuesメソッド
valuesメソッドはハッシュの値を配列として返します。
has_key? / key? / include? /member?
has_key?メソッドはハッシュの中に指定されたキーが存在するかどうかを確認するメソッドです。
currencies = {japan: 'yen', us: 'dollar',india: 'rupee'} currencies.has_key?(:japan) #=> true currencies.member?(:italy) #=> false
to_aメソッド
ハッシュを配列に変換することができるメソッドです。