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

Project1

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

[讨论] HASH的一个奇怪的地方。。。

[复制链接]

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

跳转到指定楼层
1
发表于 2009-9-13 21:23:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 神思 于 2009-9-13 21:30 编辑

平时声明HASH的时候通常都是
hash = {} or hash = Hash.new
这2种方法直接dump是合法的。。。
但是HASH有个指定默认值的方法..
那就是
hash = Hash.new{ |_self, key| _self[key] = "value"  }
p hash[66], hash[99] # =>value
但是使用这种默认缺省方法后。。
dump会出现因为写入一个proc块而报错= =·|||||||||这可真纳闷。。。
如果有大量的地方可能初次引用这个hash的话都要
hash[key] ||= value#..........

有没什么其他的办法设置初始value


= =||除了新建子类定义[]方法。。。
-.-

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 2009-9-13 22:00:54 | 只看该作者
hash = Hash.new("value")
回复 支持 反对

使用道具 举报

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

3
 楼主| 发表于 2009-9-13 22:04:13 | 只看该作者
= =这个方法我早已试过
hash = Hash.new("value")
hash[66] << "orz"
p hash[99]
她指向的value是同一个对象。。。
-.-
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
4
发表于 2009-9-13 23:48:32 | 只看该作者
本帖最后由 紫苏 于 2009-9-14 11:40 编辑

这样?
  1. hash = {}
  2. hash.default = "value"

  3. def hash.default(key = nil)  
  4.   return key ? self[key] = "value" : super(key)
  5. end

  6. hash[66] << "orz"
  7. p hash.default.id, hash[33].id, hash[66].id, hash[99].id, "",
  8.   hash.default.id, hash[33].id, hash[66].id, hash[99].id
  9. p hash
复制代码
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
5
发表于 2009-9-14 08:59:25 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

6
 楼主| 发表于 2009-9-14 11:05:55 | 只看该作者
能不能讲解下default这东西是啥?
-.-
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
7
发表于 2009-9-14 11:40:26 | 只看该作者
本帖最后由 紫苏 于 2009-9-14 11:42 编辑

就是 hash 类的一个实例方法,本来应该是返回 Hash 对象的缺省值,也就是在 new 的时候,或者通过 default= 赋的缺省值,默认是 nil,但确实永远只会返回一个对象……
它的参数有点意思,Programming Ruby 里面关于这个方法的说明是没有参数,但实际上是一个有缺省值的参数,一般在外部通过 Hash 对象调用 default 的时候是没有传递参数的,所以仅仅是获取缺省值;而通过测试发现,如果调用 [] 的时候键不存在,就会调用并返回 default,然后把键传递给 default 的参数……而这里就是把 Hash 对象的 default 重定义为了一个单例方法,如果传递了 key 的话就生成一对键值

其实和重定义 [] 差不多,只要是单例方法就不用生成子类了 =w=

又改了一下代码,default= 放到外面比较好,没必要每次都改成另一个 "value"
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-5 20:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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