ruby - ruby 类和对象 - 不同的比较方法
问题描述
所以看下面的代码:
s1 = "a"
=> "a"
s1.class
=> String
s1.class == String
=> true
s1.class === String
=> false
String == String
=> true
String === String
=> false
String === s1
=> true
String == s1
=> false
s1 == String
=> false
s1 === String
=> false
我的问题是->
- 为什么
String == String
评估为真但String === String
不是?
是因为实际上这些是不同的对象并且存储在内存的不同部分吗?如果是,那么我们为什么要初始化 String 的许多 Class 对象?(这些不应该是单身吗?)
String 继承自 Object 并包含 Comparable 模块。从对象字符串获取.===
(https://ruby-doc.org/core-2.5.1/Object.html#method-i-3D-3D-3D)
并从 Comparable 获得.==
(https://ruby-doc.org/core-2.4.0/Comparable.html#method-i-3D-3D)
通过阅读定义,我看到.===
通常与 String 相同,.==
但情况并非如此。我不知道为什么。
- 为什么
s1 === String
是假的却String === s1
是真的?
我认为这是因为.===
String 的“a”对象上的.===
实现与 String 类上的实现不同,但是 String 上的.===
(也许为什么它以这种方式工作)如何工作(它如何知道它应该比较对象的类而不是内存中的值/位置)?
解决方案
您是对的==
,并且===
是 String 类和 String 实例的不同方法。查看不同的文档
为什么String == String
评估为true
但String === String
不评估?
正如您在文档中看到的那样,Module.==
基本上意味着双方是否是同一个对象。String
班级和班级一样吗String
?是的。但如果右侧是左侧类的实例,则Module.===
返回。true
IdString
的一个实例String
?不。
为什么s1 === String
是false
但是String === s1
是true
?
s1 === String
调用===
字符串的实例。true
当双方都是同一个对象时,此方法返回。实例String
和类Sting
是同一个对象吗?不。但是String === s1
有——正如前面已经解释过的意思is_a?
:是一个实例String
的实例String
吗?是的。
推荐阅读
- kubernetes - pod.containers.spec.resources 不起作用(限制和请求)Kubernetes
- python - 使用字符串和 python 列表参数从终端运行 shell 脚本
- python - Flask 身份验证和蓝图
- cakephp-3.0 - 在 Web 应用程序中使用 httpClient 会导致错误(cakephp3 App On GCE)
- java - 比较两个列表的内容,Java,Selenium
- sql - SQL - 查找列日期是否至少部分包含日期范围
- qt - QML:没有调用 Rectangle 的 MouseArea 上的 onClicked 方法
- gruntjs - 无法使用 'in' 运算符搜索 'src' Grunt
- artifactory - 无法收集对本地 Artifactory Pypi 存储库的补丁依赖项
- java - Hibernate 5 - 以编程方式将 hbm 映射添加到配置 - 未找到命名查询