新手问题 请问 Hash 的 to_hash 到底有什么用?

angryfrog · 2013年03月17日 · 最后由 yanhao 回复于 2013年03月18日 · 3351 次阅读

a = {:a => 1, :b => 2, :c =>3} b = a.to_hash

p a.object_id p b.object_id

Hash 类的实例方法 to_hash 到底有何好处?我在看 learning ruby 这本书时,书中大概意思是表面上看起来没区别,但是降 a.to_hash 赋值给 b 后,b 并没有重新创建对象,a 和 b 的 object_id 是一样的,也就是说俩个对象属于别名关系。

可是我测试,直接 b = a,a 和 b 的 object_id 也是一样的。

所以实在不明白这歌方法到底有什么用处。另外 Array 类也有 to_a 方法。也有同样的问题。

请赐教,非常感谢!

func_a(a.to_hash) 当 a 本就是 hash 时保证程序行为. ruby 新手 我猜的。

#1 楼 @xdada 没太明白你的意思,你是说如果 func_a 需要一个 hash 类型的参数,而 a 是未知类型,为了确保 a 一定是 hash 类型,所以这里做了下强制转换?

这样如果 a 是 Array,可以通过 to_hash 方法来做转换。 而如果 a 本身就是 hash,执行一下 to_hash 方法也不会发生异常?

不过如果 a 是 String 或者 Integer 的话,是没有 to_hash 这个方法的,还是会有异常。 还不如 a = a.to_hash if a.respond_to? 'to_hash'这样处理一下或者这里用 raise 检查一下抛个异常呢。

无论如何还是感谢。

static VALUE
rb_hash_to_hash(VALUE hash)
{
    return hash;
}

具体实现也只是返回自身而已。。。。 我猜大概是为 ENV 准备的

#3 楼 @messiahxu 很感谢,从源码看,确实没做任何特殊处理。 也许目前只是弄了个壳子,以后的版本有可能会在这个方法里加什么处理。

可能是 null object pattern 的一种实现:http://en.wikipedia.org/wiki/Null_Object_pattern

需要 登录 后方可回复, 如果你还没有账号请 注册新账号