Project1

标题: 关于array和hash之间不清不白的关系 [打印本页]

作者: 灯笼菜刀王    时间: 2024-6-11 19:41
标题: 关于array和hash之间不清不白的关系
本帖最后由 灯笼菜刀王 于 2024-6-13 17:51 编辑

起因, 碰到了个难以理解的现象, 请教下是什么原因

有个hash :  h = {["字符",1,2,3,4] => [5,6,7,8]}

然后, 有个array :  a = h.keys  ; a.unshift(nil)

之后, 遍历 a.size.times{|j| p h[a[j]]} ; 可以正常p 出 h[["字符",1,2,3,4]] 的值

然后, 我要把 h的key里的字符替换, 其余不变, 发现貌似不能直接操作hash的key, 于是,我就曲线救了下
z = a[1] .clone ;  a[1][0] = "另一字符" ;  h[a[1]] = h[z] ; h.delete(z)

结果,  再次遍历 a.size.times{|j| p h[a[j]]}  ; 就发现 h[a[1]] 死活返回nil,  尽管p 出来的数组 hash key index 全部符合, 但是就是不认 h[a[1]]

哪怕, 替换后, 再一次重置a ;  a = h.keys  ; a.unshift(nil)  之后也还是无法认出  h[a[1]] , 什么原因鸭

最后, 折腾了一下午, 把key换成字符串,不用数组了, 再用 =~ 去获取所需参数才正常.....   

这里想知道 用数组当key有什么禁忌没


作者: 魔法丶小肉包    时间: 2024-6-11 21:36
我猜测跟对象的object_id有关,并且实际测试了一下...可以发现在改变数组之后key的object_id没有变化,但是呢value的object_id变化了
然后为了验证猜想使用了a来存储了改变之前的value的object_id,再利用ObjectSpace._id2ref来查找对应的对象,结果如下图,发现改变之后的object_id对应的是nil,而存储了原本object_id的a则成功查找出来了原本的value
总之这个结论不一定完全正确(我也刚发现这个问题简单测试了一下得出的结论XD,不过应该可以参考一下的...


作者: 灯笼菜刀王    时间: 2024-6-11 22:06
本帖最后由 灯笼菜刀王 于 2024-6-11 22:41 编辑
魔法丶小肉包 发表于 2024-6-11 21:36
我猜测跟对象的object_id有关,并且实际测试了一下...可以发现在改变数组之后key的object_id没有变化,但是 ...


很好的参考,  和我一开始猜的对象标示的原因差不多, 所以也尝试过重置a

但是, 为什么, 把新的键替换后, 再次初始化 a = h.keys , 此时依然得不到对应的values, 按道理此时的a的单元就是h的"原生key"了吧? 为啥判定上还是不同的object id呢~~

还是说, 即使替换keys, 而其values的数组的object_id依然是原来key的values的object_id,  结果就是不认这个"新key"咯?

必须要 a =>b ;  c=>b.clone  才行?

作者: ppspssss2    时间: 2024-6-12 11:21
本帖最后由 ppspssss2 于 2024-6-12 11:24 编辑

文章:哈希(hash)表查找速度为什么那么快?快在哪里了?
https://blog.csdn.net/zgaoq/article/details/105977355

网上看了哈希表速度比数组快,不过我看不懂哈希表 感觉 很复 杂 ,数组 凑合用 ,要 是会哈希还 是 用哈希 好




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1