次のコードはRubyTapasのスクリーンキャストから取られたものですが、私の経験者には十分に説明されていませんでした。このようなハッシュを設定する
config = Hash.new do |h,k|
h[k] = Hash.new(&h.default_proc)
end
次の方法で値を設定してアクセスできます
config[:production][:database][:adapter] = 'mysql'
puts config[:production][:database][:adapter] # => "mysql"
私がする時
puts config.inspect
ネストされたハッシュが表示されます。
{:production=>{:database=>{:adapter=>"mysql"}}}
ただし、コードを変更して(単にそれをいじくり回すために)&h.default_procを削除すると
config = Hash.new do |h,k|
h[k] = Hash.new() #&h.default_proc removed from parameter
end
このエラーが発生します
undefined method `[]=' for nil:NilClass (NoMethodError)
たとえば、これを行うと、Hash.new(&h.default_proc)で何が起こっているのかわかりません。
config[:production][:database][:adapter] = 'mysql'
puts config[:production][:database][:adapter] # => "mysql"
&hdefault_proc
このコンテキストでブロックがどのように機能しているかを詳細に説明して、それを分解できますか。procが呼び出されたときにできるかどうかも説明してください。これを機能させるためにprocが必要なのはなぜですか
config[:production][:database][:adapter] = 'mysql'
procはどのように呼び出されますか?実際にprocを呼び出すには、proc.callを実行する必要があると思いました。
前もって感謝します