Project1
标题:
能否重定义名字是符号的方法?如def [](key)
[打印本页]
作者:
imsy
时间:
2017-9-18 15:08
标题:
能否重定义名字是符号的方法?如def [](key)
本帖最后由 imsy 于 2017-9-19 02:24 编辑
可能有点无聊的问题...在游戏里大量使用了哈希表,而作为hash的主键的值……说起来有点尴尬,因为对从外部读取、重新写入的处理不善,现状是有的是符号(symbol),有的是字符串,如果把经过了写入后的哈希表给打印出来,就会是类似这样的状况:
a = {
:id=>0,
:alive=>true,
:type=>"actor",
"id"=>"0",
"alive"=>"false",
"type"=>"actor"
}
复制代码
虽然我已经尽可能的调整成统一的了,也在该加的地方加了.to_sym,之后应该能避免这个问题了,但是我又联想到另一个问题,
能否通过直接覆盖定义或者alias,来修改Hash类的def [](key)方法呢?
虽然下面这个写法是
完全错误
的,但还是借此表达一下个人想法:
class Hash
def [](key)
return self[key] if self.has_key?(key)
return self[key.to_sym] if self.has_key?(key.to_sym)
return self[key.to_s] if self.has_key?(key.to_s)
return nil
end
end
复制代码
大致就是这样,在根据key取出value前,判断哈希表中是否已经存在相应的键名。不需要考虑[]=写入和has_key?那些的问题。
我目前想到的办法只有定义一个新方法例如def get_exist_value(key)写入上面那4行内容,但是..也不想现在回过头去把所有取hash的value的地方的a[key]全给改成a.get_exist_value(key)了,所以提出了这个问题
作者:
orzfly
时间:
2017-9-18 15:58
class Hash
alias helloworld :[]
end
p ({"a"=>1}).helloworld("a")
复制代码
作者:
oott123
时间:
2017-9-18 16:05
本帖最后由 oott123 于 2017-9-18 16:09 编辑
看起来并不完全错误?
class Hash
alias foobar []
def [](key)
return self.foobar(key) if self.has_key?(key)
return self.foobar(key.to_sym) if self.has_key?(key.to_sym)
return self.foobar(key.to_s) if self.has_key?(key.to_s)
return nil
end
end
复制代码
之前的代码主要是 [] 给递归了吧
不过总而言之这听起来也不是很干净,会产生不太可预料的后果吧?
作者:
imsy
时间:
2017-9-18 16:18
本帖最后由 imsy 于 2017-9-18 16:21 编辑
{:2_258:}……emmmmm其实我是想保留[]的,就是说相当于只是修改def [](key)而不给他换名字,因为主要是不想把已经写在全世界的a[key]全部给改成a.helloworld(key)或者a.foobar(key),就算可以用替换,也不太方便把哈希和数组给区分开来……emmm给数组类也定义一个同名方法的话貌似还行……
作者:
喵呜喵5
时间:
2017-9-18 17:08
不需要兼容存档的话可以豪迈一点把 get 和 set 都重定义了
class Hash
alias m5_20170918_get []
def [](key) m5_20170918_get(key.to_sym) end
alias m5_20170918_set []=
def []=(key, v) m5_20170918_set(key.to_sym, v) end
end
a = {}
a["hello"] = 123
a[:world] = 456
p a["world"]
p a
复制代码
怎么感觉这楼全是角虫
作者:
imsy
时间:
2017-9-18 17:41
喵呜喵5 发表于 2017-9-18 17:08
不需要兼容存档的话可以豪迈一点把 get 和 set 都重定义了
哇哇哇是这样呀,脑袋没转过弯来,太谢谢啦。好久没发过帖了不知道怎么采纳,总之谢谢各位啦
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1