LoginSignup
0
0

More than 3 years have passed since last update.

【Ruby】キーを指定して値を取得する方法。ハッシュ、シンボル、fetchの違い

Last updated at Posted at 2020-12-16

個人メモです。

オブジェクトのキーを指定して値を取り出す方法には、ハッシュやシンボルでキーを指定する他に、fetchメソッドを使う方法も存在する。

・シンボル: obj[:a]
・ハッシュ:  obj['a']   ( obj["a"]も同じ )
・fetch:    obj.fetch(:a)  または  obj.fetch('a')

目次

  1. ハッシュ、シンボル、fetchの違い
    1. ①元のオブジェクトの形式による違い
    2. ②存在しないキーでエラーを表示するか?
  2. fetchメソッド
    1. 例外処理1
    2. 例外処理2
    3. 例外処理1と例外処理2を2つとも記述した場合


ハッシュ、シンボル、fetchの違い

それぞれの違いは、

  • 元のオブジェクトの形式が何か?
  • ②存在しないキーでエラーを表示するか?

の2点になる。


①元のオブジェクトの形式による違い

オブジェクトのキーの指定方法はハッシュシンボルがある。

ハッシュは文字列。シンボルは前方にコロンがついた記述となる。値を取得するときの指定はそれぞれの形式に合わせる必要がある。

ハッシュ形式の例
obj = {"a"=>1, "b"=>2, "c"=>3}

##値の取得
 obj2['b']
=> 2

##NG
obj[:b]
=> nil


シンボル形式の例
obj = {:a=>1, :b=>2, :c=>3}

##値の取得
obj[:b]
=> 2

##NG
obj['b']
=> nil

つまり、'b':bはイコールではない。

ハッシュは定義したオブジェクト毎に固有だが、シンボルは同じキーであれば全て同一になるという違いがある。


②存在しないキーでエラーを表示するか?

上記の例でわかるように、シンボルとハッシュを指定した場合、指定したキーが存在しなくてもエラーにはならず、nilが返る。

エラーを表示したい場合にfetchを使う。

obj = {:a=>1, :b=>2, :c=>3}

##値が存在する場合
obj.fetch(:b)
=> 2

##値が存在しない場合 case1
obj.fetch(:g)
KeyError (key not found: :g)

##値が存在しない場合 case2
obj.fetch("b")
KeyError (key not found: "b")

存在しない値を指定するとKeyError (key not found: 指定したキー)が返る。


fetchメソッド

fetchメソッドでは第2引数やブロックを記述することで、エラー時の表示内容を指定することができる。(例外処理が簡単に指定できる)

オブジェクト.fetch(キー, 例外処理1){|変数2| 例外処理2
}

  • 例外処理1は変数でも、値でも指定可能
  • 例外処理1と例外処理2が両方記載されている場合は 例外処理2が優先される
  • 例外処理2の変数2にはキー名が入る
  • {}内に|変数|の記述がないときは処理結果のみが返る。


例外処理1

オブジェクト.fetch(キー, 例外処理)

▼文字列で指定

文字列で指定
obj = {:a=>1, :b=>2, :c=>3}
obj.fetch(:g, "errorです")

=> "errorです"



▼変数で指定1

文字列で指定
obj = {:a=>1, :b=>2, :c=>3}

e = "errorです"
obj.fetch(:g, e)

=> "errorです"



▼変数で指定2
カッコの中で変数に値を代入することも可能。

文字列で指定
obj = {:a=>1, :b=>2, :c=>3}
obj.fetch(:g, e = "errorです")

=> "errorです"


例外処理2

オブジェクト.fetch(キー){|変数| 例外処理}

ブロック{}で例外処理を指定することも可能。

obj = {:a=>1, :b=>2, :c=>3}
obj.fetch(:g){|x| "#{x}は存在しません"  }

=> "gは存在しません"



▼変数展開
文字列""の中で#{変数}を記述することで変数の値を文字列として表示できる。



▼変数を指定しない場合
変数を指定しない場合、例外処理の記述のみが返る。

obj = {:a=>1, :b=>2, :c=>3}
obj.fetch(:g){ "エラーです" }

=> "エラーです"


例外処理1と例外処理2を2つとも記述した場合

例外処理1と例外処理2を2つとも記述した場合は、警告メッセージと共に、例外処理2が返る。

obj.fetch(:g, "error1です"){ "ERROR2です" }
warning: block supersedes default value argument
=> "ERROR2です"

supersedesは取って代わるの意味。

0
0
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
0
0