看板 Ruby 關於我們 聯絡資訊
最近在寫一個Compiler 需要一個Hash, 有以下行為: hash[:a][:a] = :a hash[:b][:b] = :b hash[:c] = :c 對其他的組合, hash[x][y] = nil 可是其實這是兩層的hash, 所以我可以說 hash[:d] = nil (by default) 可是我不能做以下設定: hash[:c][:a] = nil 或著 hash[:d][:a] = nil 因為, hash[:c] = :c, hash[:c][:a] = :c[:a], 會runtime error hash[:d] = nil, hash[:d][:a] = nil[:a], 也會runtime error. 不過,由於Ruby的特性,我可以把任意class的單一method做重新定義。 所以我做了以下的事情: class NilClass def [](*arg) return nil end end class Symbol alias :oldArrayAccss :[] def [](*args) return nil if (args[0].class == Symbol) self.oldArrayAccess(*args) end end 就達成我想要做的事情了,對於所有x: nil[x] = nil :a[:d] = nil 甚至現在我可以 hash[:a][:b][:c][:d], 也會回傳nil 只能說Ruby真是一個很好(很好惡搞)的語言呀!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.241.193.28
godfat:感覺你也可以用 hash[[:a,:b,:c]] 和 hash[[:a]] ? 06/01 19:26
SansWord:是阿,可是我比較喜歡連續這樣使用。宣告上比較方便 06/01 20:32
SansWord:godfat 今年暑假還會去flolac嗎? 06/01 20:34
godfat:這次是 mountain (verification) 嘛?也不是說完全沒興趣, 06/02 23:33
godfat:不過要請假請這麼久的話,就覺得有點划不來了 @@" so... 06/02 23:34
godfat:倒是想聽 automata 的東西... >< 06/02 23:34
SansWord:前年去過,感覺就是值域只有01的verification。 06/03 03:05
SansWord:可是templar automata和modal-logic我前年聽的滿開心的。 06/03 03:06