Ruby初心者スレッド Part 12at TECH
Ruby初心者スレッド Part 12 - 暇つぶし2ch306:デフォルトの名無しさん
07/05/13 23:01:50
>>304
えーと、どこから説明していいものか。ちょっと複雑になるけど説明してみる。

まずその例は値を与えていないハッシュのキーに初期値を与えたいってことだよね。
んで初期値を整数にしたいときはh = Hash.new(0)でできる。このとき、
h[1]=0とか代入しなくてもh[1]は0になる。ここまではいいね?

では初期値として"baka"(文字列)を与えてみたらどうなるか。

 h2 = Hash.new("baka")
 p h2[1] # => "baka"
 h2[1] << "shine"
 p h2[1] #=> "bakashine"
 p h2[2] #=> "bakashine" ??? "baka"ではないの?

ということになる。それぞれの初期値は同じインスタンスを指しているためにこういったことが起こる。
これは直感に反する動きなのでそれを解決するためにブロックを渡せるようにした。

 h2 = Hash.new{|h, k| h[k] = "baka"} # その都度新しいStringオブジェクトを生成して代入
 p h2[1] # => "baka"
 h2[1] << "shine"
 p h2[1] #=> "bakashine"
 p h2[2] #=> "baka"

というわけ。ややこしいけど。




次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch