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,不过应该可以参考一下的...
(, 下载次数: 161)
上传
点击文件名下载附件
(, 下载次数: 168)
上传
点击文件名下载附件
作者:
灯笼菜刀王
时间:
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! X5.0