LoginSignup
3
0

More than 1 year has passed since last update.

ハッシュとdefault_procについて

Posted at

ハッシュでの[]の使い方

ハッシュでの[]は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メソッドが使われています。

実際に問題を解いてみましょう

image.png
みなさんも考えながら解いてみてください

選択肢➀

この選択肢だとエラーが起きます。
理由は、この記述の仕方は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が返ってくるんですね

以上より、正解は➀と➃でした。
何か間違いがございましたら、ご教示いただけますと幸いです。

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