個人メモです。
オブジェクトのキーを指定して値を取り出す方法には、ハッシュやシンボルでキーを指定する他に、fetchメソッドを使う方法も存在する。
・シンボル: obj[:a]
・ハッシュ: obj['a'] ( obj["a"]も同じ )
・fetch: obj.fetch(:a) または obj.fetch('a')
##目次
-
ハッシュ、シンボル、fetchの違い
2. ①元のオブジェクトの形式による違い
3. ②存在しないキーでエラーを表示するか? -
fetchメソッド
5. 例外処理1
6. 例外処理2
7. 例外処理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は取って代わるの意味。