フタミノブログ

マーケティングから技術まで色々

ハッシュやシンボルを理解する

今日も続きをやっていきます。 ハッシュやシンボルをやっていきます。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メソッド

ハッシュを配列に変換することができるメソッドです。