ruby中Hash的自定义key

ESP32-S3 USB下载模式深度解析:从UART0到TinyUSB的硬件设计与避坑指南 本文深度解析ESP32-S3的三种USB下载模式:UART0、Hardware CDC和基于TinyUSB的USB-OTG CDC。详细探讨各模式的硬件设计要点、电平异常问题、eFuse配置及避坑指南,帮助开发者优化设计,提升量产效率和系统稳定性。 阅读详情

Hash主要使用Key中的两个函数:hash和eql? hash返回的是对象的hash值,eql?是用来对比两个对象是不是相等。

回顾下Hash这种数据结构,其首先需要一个hash函数返回一个整数,ruby中为Fixnum,然后根据Fixnum去使用eql?判断两个object是不是相同。

所以,如果只是改变了hash函数,就仅仅会让具有相同实例的objecthash到同一个Fixnum,但是eql?不相等,也没有办法当成同一个key。同样,如果只修改eql?,相同字段的object可能都没有办法hash到同一个Fixnum,那么同样也没有办法当作同一个key。


为了说明这两个函数的用处,我将分四种情况讨论。

情况1)定义一个Kiwi,不改变hash和eql?

class Kiwi
	attr_reader :id, :name

	def initialize(id, name)
		@id = id
		@name = name
	end
end
Kiwi.new(1, "kiwi").eql?(Kiwi.new(1, "kiwi"))  #=> false
hash = Hash.new #=> {}
hash[Kiwi.new(1, "kiwi")]  = 1  #=> {#<Kiwi:0x00000001ec8230 @id=1, @name="kiwi">=>1}
hash[Kiwi.new(1, "kiwi")]     #=> nil


从情况1中,我们可以看出在没有重写hash和eql?的情况下,虽然Kiwi的两个实例字段相同,但是不能相等,同时,hash具有相同字段的Kiwi实例,也不能得到结果。


情况2)仅修改hash,不修改eql?

class Kiwi
	attr_reader :id, :name

	def initialize(id, name)
		@id = id
		@name = name
	end
	def hash
		@id.hash
	end
end
Kiwi.new(1, "kiwi").eql?(Kiwi.new(1, "kiwi"))  #=> false
hash = Hash.new #=> {}
hash[Kiwi.new(1, "kiwi")]  = 1  #=> {#<Kiwi:0x00000000c38de0 @id=1, @name="kiwi">=>1}
hash[Kiwi.new(1, "kiwi")]     #=> nil

结果与情况1中相同


情况3)仅修改eql?

class Kiwi
	attr_reader :id, :name

	def initialize(id, name)
		@id = id
		@name = name
	end
	def eql?(other)
		self.class.equal?(other.class) && @id == other.id && @name == other.name
	end
end
Kiwi.new(1, "kiwi").eql?(Kiwi.new(1, "kiwi"))  #=> true
hash = Hash.new #=> {}
hash[Kiwi.new(1, "kiwi")]  = 1  #=>{#<Kiwi:0x00000000f5ba90 @id=1, @name="kiwi">=>1}
hash[Kiwi.new(1, "kiwi")]     #=> nil

可以看出当Kiwi两个实例变量相同的相同的时候,Kiwi即相等


情况4)同时修改hash和eql?

class Kiwi
	attr_reader :id, :name

	def initialize(id, name)
		@id = id
		@name = name
	end
	def eql?(other)
		self.class.equal?(other.class) && @id == other.id && @name == other.name
	end
	def hash
		@id.hash
	end
end
Kiwi.new(1, "kiwi").eql?(Kiwi.new(1, "kiwi"))  #=> true
hash = Hash.new #=> {}
hash[Kiwi.new(1, "kiwi")]  = 1  #=>  {#<Kiwi:0x00000000b928f0 @id=1, @name="kiwi">=>1}
hash[Kiwi.new(1, "kiwi")]     #=> 1

这下就只要kiwi的实例变量相同,都被当成同一个key了


Ubuntu零基础入门到精通【3.10讲】:旧版本 Ubuntu 升级与迁移路线:从 20.04 到 24.04 的完整实战指南 🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。 阅读详情

相关推荐

构建多节点AI代理网络:OpenClaw协同框架与实战部署指南

在分布式系统与AI代理技术领域,多节点协同是提升智能体能力与扩展性的核心挑战。其原理在于通过设计清晰的通信协议与数据同步机制,使分散的智能体能够共享状态、知识与技能,从而实现1+1>2的群体智能。这一技术价值在于突破了单点AI的能力上限,为构建复杂、鲁棒且可扩展的自动化系统提供了基础。典型的应用场景包括跨设备任务编排、企业级工作流自动化以及大规模AI代理集群的管理。本文聚焦于OpenClaw这一开源AI代理框架,深入探讨如何利用模块化设计(如网状网络与任务控制中心)实现记忆共享与统一调度,解决多网关协同中的

weixin_42521032的博客 298

蛋白质-配体对接技术:从分子力学到深度学习的药物发现

蛋白质-配体对接是计算药物发现中的关键技术,通过模拟小分子与靶标蛋白的结合模式和亲和力来加速药物研发。传统方法依赖分子力场(如AMBER、CHARMM)和算法(如AutoDock Vina)进行构象搜索和能量评估,而新兴的深度学习技术(如3D-CNN、图神经网络)则能自动学习分子相互作用,显著提高预测准确率。这些技术在虚拟筛选中发挥核心作用,可快速评估上万种化合物的潜在活性。随着生成式模型和自动化流程的发展,蛋白质-配体对接正与ADMET预测等模块整合,推动AI驱动的端到端药物研发。

weixin_30918633的博客 567

AI算力网络与通信领域流量分析:优化策略探讨_副本

今天的AI就像一个"超级吃货",每天要"吃"掉海量数据、“消耗"巨量算力——训练一个千亿参数的大模型,可能需要上万块GPU同时工作数周,其间产生的数据传输量足以填满数百万个1TB硬盘。这些GPU和计算节点通过网络连接形成"AI算力网络”,而数据在节点间的流动就是"通信流量"。如果把算力比作AI的"肌肉",那流量就是"血液"——血液不通畅,肌肉再强也使不上劲。

AI天才研究院 1197

as_hash ruby_Ruby中带有示例的Hash.has_key?()方法

as_hash ruby Hash.has_key?()方法 (Hash.has_key?() Method) In this article, we will study about Hash.has_key?() Method. The working of the method can't be assumed because it's quite a different name. Let...

cumubi7552的博客 500

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1786

【车辆动力学】专栏目录汇总

车辆动力学知识目录汇总

CrazyRabbit的博客 1713

Ruby 中 hash merge/store 的简单使用

在 Ruby 中,哈希表是一种键值对集合,支持高效的元素查找和修改。使用哈希表可以存储各种类型的数据,如字符串、数字、数组、哈希表等。方法可以将两个哈希表合并为一个新的哈希表,并返回合并后的哈希表。如果合并的两个哈希表中有相同的键,则取后者的值。方法可以将另一个哈希表合并到当前哈希表中,并修改当前哈希表。如果合并的两个哈希表中有相同的键,则取后者的值。如果哈希表中已经存在该键,则将该键的值更新为新的值。如果哈希表中已经存在该键,则将该键的值更新为新的值。Ruby 提供了多种用于哈希表合并和存储的方法,如。

Toml_的博客 433

做蛋白组学数据分析,竟然还不会使用DIA-NN软件,走过路过不要错过,进来免费学习!!!

蛋白组学分析工具DIA-NN使用

wcy1995427的博客 9864

ruby hash方法_Ruby中带有示例的Hash.key?(obj)方法

ruby hash方法 Hash.key?(obj)方法 (Hash.key?(obj) Method) In this article, we will study about Hash.key?(obj) Method. The working of the method can't be assumed because of it's quite a different name. Let ...

cumt951045的博客 406

从零开始学华为设备:手把手教你用ENSP搭建OSPF实验环境(附拓扑文件)

本文详细介绍了如何使用华为ENSP模拟器从零开始搭建OSPF多区域网络实验环境,包括拓扑规划、设备配置、OSPF参数优化及故障排查技巧。通过实战案例和配置示例,帮助网络工程师快速掌握华为设备的OSPF协议配置,提升企业网络环境中的实战能力。

weixin_29305313的博客 286

一台NAS两个系统:飞牛nas上完美运行群晖DSM?(飞牛nas+群晖nas套娃安装实操)

想在飞牛NAS上体验群晖DSM系统?💡 本文详细记录了飞牛nas上部署群晖的完整过程,从镜像转换到系统安装,每一步都有详细说明 🖥️,让你在不增加硬件成本的情况下,轻松实现一套硬件、多种系统的灵活部署 ✅

XiaoqiangClub的博客 2367

ruby on rails hash删除key值以及value值,删除多个key

1.单个删除 delete方法 例如: [1] pry(main)> hash = {a: 1, b: 2, c: 3} => {:a=>1, :b=>2, :c=>3} [2] pry(main)> hash.delete(:a) => 1 [3] pry(main)> hash => {:b=>2, :c=>3} [4] pry(main)> 2.删除多个key 这里我用了delete_if 方法; delete_if

weixin_42800181的博客 939

【uni-app】PDA扫码枪获取扫码数据APP(通俗易懂),聚焦频繁弹软键盘输入法等各种坑完美解决方法,附完整代码

uniapp PDA扫码枪获取扫码数据APP(通俗易懂),频繁弹软键盘等各种坑完美解决方法

coderYYY的博客 7418

Ruby 哈希(Hash)

哈希(Hash)是类似 "key" => "value" 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。Hash 的索引(或者叫"键")几乎可以是任何对象。Hash 虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。如果顺序很重要的话就要使用数组了。

zhoujinm的博客 1144

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

as_hash ruby_Ruby中带有示例的Hash.each_key方法

as_hash ruby Hash.each_key方法 (Hash.each_key Method) In this article, we will study about Hash.each_key Method. The working of this method can be predicted with the help of its name but it is not as si...

cumtv80668的专栏 437

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Ruby中带有示例的Hash.key?(value)方法

Hash.key?(value)方法 (Hash.key?(value) Method) In this article, we will study about Hash.key?(value) Method. The working of the method can't be assumed because it's quite a different name. Let us read ...

cumt951045的博客 736

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ruby hash添加数据_如何在Ruby中向Hash添加元素?

ruby hash添加数据Before going through the ways to add elements to the hash instances, let us understand what could be called as a hash element. So, Hash is the collection of keys and their values. For exa...

cumudi0723的博客 1599

【Ruby学习笔记】11.Ruby 哈希(Hash)

哈希(Hash)是类似 "key" => "value" 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。

qq_62052372的博客 530

Ruby学习之模块哈希(Hash)的定义和使用

哈希(Hash)是类似 "key" =&gt; "value" 这样的键值对集合,类似于一个数组,只不过它的索引不局限于使用数字,它的索引(或者叫"键")几乎可以是任何对象,它虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。 如果顺序很重要的话就要使用数组了。与数组一样,有各种不同的方式来创建哈希,我们来分别看下: #通过 new 类方法创建一个空的哈希 months ...

luyaran的博客 1932

Hash.store(key,value)Ruby中的示例方法

Hash.store(key,value)方法 (Hash.store(key, value) Method) In this article, we will study about Hash.store(key, value) Method. The working of this method can be predicted with the help of its name but i...

cumt30111的博客 321

ruby hash方法_Ruby中带有示例的Hash.keys方法

ruby hash方法 哈希键方法 (Hash.keys Method) In this article, we will study about Hash.keys Method. The working of the method can't be assumed because of it's quite a different name. Let us read its definitio...

cumudi0723的博客 351

ruby 生成哈希值_如何检查Ruby中是否存在哈希键?

ruby 生成哈希值We know that Hashes are the instances which are the combination of keys and their values. A particular key in hash may contain more than one value as well. In this article, we will see how w...

cumudi0723的博客 995

ruby hash方法_Ruby中带有示例的Hash.default(key = nil)方法

ruby hash方法 Hash.default(key = nil)方法 (Hash.default(key=nil) Method) In this article, we will study about Hash.default(key=nil) Method. The working of this method can be predicted with the help of its...

cumtb2002的博客 223
上一篇: 视频网站:一炷香后即将为您播放精彩内容
下一篇: ruby中Hash的默认值小陷阱
kiwi小白
博客等级 码龄14年 153粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值