夜空日和 [出張版]

星を見上げながら、今日を語ってみようか

 

スポンサーサイト


Category: スポンサー広告   Tags: ---
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Ruby] Hash#defaultの罠


Category: 技術   Tags: ---
ふと、嵌ってしまったことのメモ。

Hash#newでは、引数でキーが存在しない場合のデフォルト値が設定できます。
h = Hash.new("Hello!")
puts h[:hoge] #=> "Hello!"
しかし、実際の挙動は「キーが存在しない場合、デフォルト値の参照が与えられる」ということでした。
なので、破壊的操作を行うと、デフォルト値が変化してしまいます。
# Ruby 1.9.3 リファレンスマニュアルより
# http://doc.ruby-lang.org/ja/1.9.3/method/Hash/s/new.html
h = Hash.new([])
h[0] << 0 # h[0] = [0]
h[1] << 1 # h[1] = [0, 1]
p h.default #=> [0, 1]
これに気づくのに手間取りました (;´д`)トホホ…
こちらは「デフォルト値の clone or dup が取得できる」と考えてたので・・・

解決法としては、「キーが存在しない場合の挙動」を設定すれば良いお話でした。
h = Hash.new{|h, k| h[k] = []}
h[0] << 0 # h[0] = [0]
h[1] << 1 # h[1] = [1]
p h.default #=> nil
結論:リファレンスマニュアル読みましょう ( ・ω・)∩ハーイ
スポンサーサイト


Comments

Leave a Comment



08 2017
SUN MON TUE WED THU FRI SAT
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

07

09


 
プロフィール

ひでたそ

Author:ひでたそ
Comment:
現役大学生で天文好き。
今日もどこかで、上を見ながら歩いています。

 
 
 
最新トラックバック
 
 
検索フォーム
 
 
 
ブロとも申請フォーム
 
QRコード
QRコード
 

Archive   RSS   Login

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。