设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2599|回复: 6
打印 上一主题 下一主题

[已经解决] 能否重定义名字是符号的方法?如def [](key)

[复制链接]

Lv4.逐梦者

梦石
0
星屑
12304
在线时间
21820 小时
注册时间
2010-10-24
帖子
308
跳转到指定楼层
1
发表于 2017-9-18 15:08:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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)了,所以提出了这个问题

Lv4.逐梦者

梦石
0
星屑
12304
在线时间
21820 小时
注册时间
2010-10-24
帖子
308
6
 楼主| 发表于 2017-9-18 17:41:34 | 只看该作者
喵呜喵5 发表于 2017-9-18 17:08
不需要兼容存档的话可以豪迈一点把 get 和 set 都重定义了


哇哇哇是这样呀,脑袋没转过弯来,太谢谢啦。好久没发过帖了不知道怎么采纳,总之谢谢各位啦
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21681
在线时间
9419 小时
注册时间
2012-6-19
帖子
7119

开拓者短篇九导演组冠军

5
发表于 2017-9-18 17:08:54 | 只看该作者
不需要兼容存档的话可以豪迈一点把 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
复制代码


怎么感觉这楼全是角虫

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12304
在线时间
21820 小时
注册时间
2010-10-24
帖子
308
4
 楼主| 发表于 2017-9-18 16:18:42 | 只看该作者
本帖最后由 imsy 于 2017-9-18 16:21 编辑

{:2_258:}……emmmmm其实我是想保留[]的,就是说相当于只是修改def [](key)而不给他换名字,因为主要是不想把已经写在全世界的a[key]全部给改成a.helloworld(key)或者a.foobar(key),就算可以用替换,也不太方便把哈希和数组给区分开来……emmm给数组类也定义一个同名方法的话貌似还行……

点评

……没满世界换啊,只是存起来内部用  发表于 2017-9-19 22:24
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3001
在线时间
333 小时
注册时间
2012-2-9
帖子
313

烫烫烫开拓者

3
发表于 2017-9-18 16:05:21 | 只看该作者
本帖最后由 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
复制代码


之前的代码主要是 [] 给递归了吧
不过总而言之这听起来也不是很干净,会产生不太可预料的后果吧?

评分

参与人数 1星屑 +150 收起 理由
RyanBern + 150 我很赞同

查看全部评分

前端,非专业;不懂法律,完全业余。
回复 支持 反对

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

2
发表于 2017-9-18 15:58:48 | 只看该作者
  1. class Hash
  2.   alias helloworld :[]
  3. end

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

评分

参与人数 1星屑 +150 收起 理由
RyanBern + 150 我很赞同

查看全部评分

我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 18:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表