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

Project1

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

[已经解决] 关于array和hash之间不清不白的关系

[复制链接]

Lv5.捕梦者

梦石
0
星屑
39049
在线时间
5727 小时
注册时间
2006-11-10
帖子
6626
跳转到指定楼层
1
发表于 2024-6-11 19:41:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 灯笼菜刀王 于 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有什么禁忌没

Lv4.逐梦者

梦石
0
星屑
6560
在线时间
1481 小时
注册时间
2015-7-25
帖子
652

极短25参与开拓者

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

评分

参与人数 2星屑 +100 +2 收起 理由
RyanBern + 100 + 1 认可答案
灯笼菜刀王 + 1 认可答案

查看全部评分

笨肉包的首款像素OC游戏《花城梦之心》尝试制作中~
目前的坑 【不可思议的迷宫】幽灵契约外传:歌莉娅
持续更新中~ 当前进度 v0.28
大版本更新时才会更新网盘文件,预计下次大版本更新:v0.30
完成度:
主线 15% 支线 0% 数据库 6% 系统 86% 美术 6%
两边同时填坑~
( 这里是笨肉包~专修魔法!目标是大魔法师!
( 坑太大啦,一个人填不完啦hhh 一定会填完的嗯...
( 每天都和bug们比试魔力~吾之魔法将扫平一切!
( 弱点是美术,魔法修行之余再补补课吧~
( 哼哼哼~这便是魔法的力量!
大家都离开啦,笨肉包也不知道还能坚持多久呀...
这是属于笨肉包一个人的旅行(再见了...蚊子湯,七重酱,笨肉包永远想你们!TwT
回复 支持 1 反对 0

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39049
在线时间
5727 小时
注册时间
2006-11-10
帖子
6626
3
 楼主| 发表于 2024-6-11 22:06:51 | 只看该作者
本帖最后由 灯笼菜刀王 于 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  才行?

点评

原来还有猫腻压, 看来以后要少用array当key....  发表于 2024-6-13 17:38
从结果上来看确实keys会跟随a发生变化,但有问题的是如果改a[0]而不是改a[0][0]的话keys又不会发生变化,所以问题出现的点是对的,但原理不一定是这样  发表于 2024-6-11 23:33
如果有结果的话后续会再发出来  发表于 2024-6-11 23:24
上面的结果肯定是对的,但是关于这一楼的问题还需要测试一下,因为我发现刚刚出来的几组数据跟我想的有出入  发表于 2024-6-11 23:22
刚刚又做了几组测试,感觉问题没那么简单,回头有时间我再详细测试一下看看,可能不是这个原因  发表于 2024-6-11 23:21
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1432
在线时间
259 小时
注册时间
2023-11-9
帖子
51
4
发表于 2024-6-12 11:21:30 | 只看该作者
本帖最后由 ppspssss2 于 2024-6-12 11:24 编辑

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

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

点评

数组和哈希各有各的好处, 也有不可替代性的说  发表于 2024-6-13 17:39
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-4 02:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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