作者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
1F:推 godfat:感觉你也可以用 hash[[:a,:b,:c]] 和 hash[[:a]] ? 06/01 19:26
2F:→ SansWord:是阿,可是我比较喜欢连续这样使用。宣告上比较方便 06/01 20:32
3F:→ SansWord:godfat 今年暑假还会去flolac吗? 06/01 20:34
4F:推 godfat:这次是 mountain (verification) 嘛?也不是说完全没兴趣, 06/02 23:33
5F:→ godfat:不过要请假请这麽久的话,就觉得有点划不来了 @@" so... 06/02 23:34
6F:→ godfat:倒是想听 automata 的东西... >< 06/02 23:34
7F:→ SansWord:前年去过,感觉就是值域只有01的verification。 06/03 03:05
8F:→ SansWord:可是templar automata和modal-logic我前年听的满开心的。 06/03 03:06