作者SansWord (是妳)
看板Ruby
標題[心得] 改變nil的行為。
時間Wed Jun 1 18:01:07 2011
最近在寫一個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