Project1

标题: 能否重定义名字是符号的方法?如def [](key) [打印本页]

作者: imsy    时间: 2017-9-18 15:08
标题: 能否重定义名字是符号的方法?如def [](key)
本帖最后由 imsy 于 2017-9-19 02:24 编辑

可能有点无聊的问题...在游戏里大量使用了哈希表,而作为hash的主键的值……说起来有点尴尬,因为对从外部读取、重新写入的处理不善,现状是有的是符号(symbol),有的是字符串,如果把经过了写入后的哈希表给打印出来,就会是类似这样的状况:
  1. a = {
  2. :id=>0,
  3. :alive=>true,
  4. :type=>"actor",
  5. "id"=>"0",
  6. "alive"=>"false",
  7. "type"=>"actor"
  8. }
复制代码

虽然我已经尽可能的调整成统一的了,也在该加的地方加了.to_sym,之后应该能避免这个问题了,但是我又联想到另一个问题,能否通过直接覆盖定义或者alias,来修改Hash类的def [](key)方法呢?虽然下面这个写法是完全错误的,但还是借此表达一下个人想法:
  1. class Hash
  2.   def [](key)
  3.     return self[key] if self.has_key?(key)
  4.     return self[key.to_sym] if self.has_key?(key.to_sym)
  5.     return self[key.to_s] if self.has_key?(key.to_s)
  6.     return nil
  7.   end
  8. 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
  1. class Hash
  2.   alias helloworld :[]
  3. end

  4. p ({"a"=>1}).helloworld("a")
复制代码

作者: oott123    时间: 2017-9-18 16:05
本帖最后由 oott123 于 2017-9-18 16:09 编辑

看起来并不完全错误?

  1.     class Hash
  2.       alias foobar []
  3.       def [](key)
  4.         return self.foobar(key) if self.has_key?(key)
  5.         return self.foobar(key.to_sym) if self.has_key?(key.to_sym)
  6.         return self.foobar(key.to_s) if self.has_key?(key.to_s)
  7.         return nil
  8.       end
  9.     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 都重定义了

  1. class Hash
  2.   alias m5_20170918_get []
  3.   def [](key) m5_20170918_get(key.to_sym) end
  4.   alias m5_20170918_set []=
  5.   def []=(key, v) m5_20170918_set(key.to_sym, v) end
  6. end

  7. a = {}
  8. a["hello"] = 123
  9. a[:world] = 456
  10. p a["world"]
  11. 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