##ハッシュでの[]の使い方
ハッシュでの[]はkeyに対応したvalueの値を返すんです。
h = {:hoge => "HOGE" , :fuga => "FUGA"}
p hash[:hgoe]
=> "HOGE"
##デフォルトの値をいれる。
先ほどのコードを使ってデフォルトの値を入れてみます
h = {:hoge => "HOGE" , :fuga => "FUGA"}
p hash[:hgoe]
=> "HOGE"
#デフォルトの値を入れてみる
h = {:hoge => "HOGE" , :fuga => "FUGA"}
h.default = "これはデフォルトだよ!"
p h[:foo]
=> "これはデフォルトだよ!"
##default_procとは
defaultのprocです。procに関しては、以前ぼくが解説したこちらの記事を参考にしてみてください
ざっくりいうと、ブロックをオブジェクトにして使いまわせるようにしたものがProcというものなんです。
そのProcをデフォルトにしたものが、default_procというものです。
実際にコードを見ていきましょう。
h = Hash.new {|hash, key| "The #{key} not exist in #{hash.inspect}"}
p h.default #=> nil
p block = h.default_proc #=> #<Proc:0x0x401a9ff4>
p block.call({},:foo) #=> "The foo not exist in {}"
3行目で変数hで記述されたブロックをデフォルトのProcとして変数blockに格納しています。
そのProcを呼び出すには、callメソッドを使うんでしたね。なので、4行目ではcallメソッドが使われています。
##実際に問題を解いてみましょう
みなさんも考えながら解いてみてください
###選択肢➀
この選択肢だとエラーが起きます。
理由は、この記述の仕方はKeyに対応したvalueの値をとります。しかし、この選択肢では、valueの値が設定されていません。そのため、この選択肢では、不正解です。
###選択肢➁
この選択肢は正解になります。defaultメソッドは、keyとvalueそれぞれにデフォルトの値として何らかの値を入れるメソッドです。今回でいえばnilです。そのため、このコードを打つと、nilが返ってきます。
###選択肢➂
この選択肢だとエラーが起きます
default_procには、new以降のブロックがデフォルトとして入っています。そして、それをcallメソッドで、hには1、kには2をいれるように呼び出しています。callメソッドで意図的にブロックを呼び出して例外を発生させています。そのため、この選択肢では、不正解です。
###選択肢➃
この選択肢は正解になります。default_procメソッドを実行した時の値をnilにしています。つまり、ブロックの値をnilにしているんです。そのため、p hash[:a]と打った時に、nilが返ってくるんですね
以上より、正解は➀と➃でした。
何か間違いがございましたら、ご教示いただけますと幸いです。