3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[初心者向け]ハッシュを使用するときに注意すること[Ruby]

Last updated at Posted at 2024-12-29

はじめに

こんにちは。プログラミングスクールRUNTEQで勉強中のやま さかな@YamzknAと申します。

学習中、 ハッシュを使用して条件分岐を簡単に書けるのでは? と思って調べた際に、いくつか注意点が浮かんだので、ここにまとめます。

プログラミング初学者の記事になります。
間違いや不足等あれば、教えていただけると幸いです。


ハッシュに関しては以下を参照してください↓↓

前提

この記事ではRubyにて解説を行います。

環境

  • ruby 3.2.3

条件分岐をハッシュで書くとは

先達が分かりやすく書いてくださっている記事があったので、
この部分に関しては以下の記事を参照してください↓↓

簡単に説明すると、以下のように書き換えることができます。

#priceの値を求める処理
# if文を使った例
fruit = "apple"
if fruit == "apple"
  price = 100
elsif fruit == "banana"
  price = 150
end

# ハッシュを使った例
prices = {
  "apple" => 100,
  "banana" => 150
}
price = prices["apple"]  # キー"apple"に対応する値を直接取得

ハッシュを使用する際に気を付けること

今回は2つのケースについて説明します。

  1. キーが存在しない場合に注意!
  2. キーのデータ型に注意!

1. キーが存在しない場合に注意!

指定したキーが存在しない場合はnilが帰ってきてしまうので、存在確認を行うなどして回避する。

def get_price(fruit)
  prices = {
    "apple" => 100,
    "banana" => 150
  }
  prices[fruit]
end

p get_price("orange")
=> nil

def get_price(fruit)
  prices = {
    "apple" => 100,
    "banana" => 150
  }
  # キーの存在確認
  prices[fruit] || "価格不明"
end

p get_price("orange")
=> "価格不明"

or

def get_price(fruit)
  prices = {
    "apple" => 100,
    "banana" => 150
  }
  
  if prices.has_key?(fruit)
    prices[fruit]
  else
    "価格不明"
  end
end

p get_price("orange")
=> "価格不明"

など

2. キーのデータ型に注意!

指定したキーの型が違う場合もnilが返ってきます。

def identify_bakufu(year)
  bakufu = {
    "1185" => "鎌倉幕府",
    "1603" => "江戸幕府"
  }

  bakufu[year]
end 

p identify_bakufu(1185) #ハッシュでは文字列型をキーとしているためnilが返る
=> nil

p identify_bakufu("1185")
=> "鎌倉幕府"

加えて、ハッシュをシンボルで定義している場合も注意が必要です。
def get_price(fruit)
  prices = {
    apple: 100,
    banana: 150
  }

  prices[fruit]
end

p get_price("apple") #これではnilになる
=> nil

p get_price(:apple) #しっかりシンボルで指定する
=> 100

or

def get_price(fruit)
  prices = {
    apple: 100,
    banana: 150
  }
  # キーの存在確認
  prices[fruit.to_sym] #文字列オブジェクトをシンボルに変換する
end

p get_price("apple")
=> 100

さいごに

ハッシュは中身を書き換えることができる点にも注意が必要です。
条件分岐と違って、ハッシュは後からアクセスして編集することができてしまいます。
つまり、呼び出した際にすでに書き換わっている危険性をはらんでいるわけです。
関数の外でハッシュを定義する場合などは、必要に応じて.freezeすることも視野に入れると良さそうです。

また、今回はあくまで読みやすいコードにすることが目的ですので、どちらが読みやすいかを意識して書いていきたいです。
ハッシュは入れ子になると、途端に見づらくなるので、そういった点も意識しておきたいですね。

.freezeに関しては以下を参照↓↓

以上になります。
ありがとうございました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?