個人メモです。
オブジェクトのキーを指定して値を取り出す方法には、ハッシュやシンボルでキーを指定する他に、fetchメソッドを使う方法も存在する。
・シンボル: obj[:a]
・ハッシュ: obj['a'] ( obj["a"]も同じ )
・fetch: obj.fetch(:a) または obj.fetch('a')
目次
ハッシュ、シンボル、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は取って代わるの意味。