===在ruby中是如何工作的?
我知道这个类定义了===在ruby中是如何工作的?,ruby,Ruby,我知道这个类定义了==来测试 对象是该类的实例 现在的问题是,为什么只有当类是左手操作数时,才会将其求值为true 示例: 'a' === String #false 及 或 因为 字符串=='a'与字符串相同。==('a'),调用类#===,从模块继承,以测试参数是否从接收器模块继承;及 'a'===String与'a'==(String)相同,后者调用从对象继承的字符串#===,以测试参数是否等于接收方对象 换句话说,==是不对称的对象#==和模块#==是非常不同的方法。还有Regex
==
来测试
对象是该类的实例
现在的问题是,为什么只有当类
是左手操作数时,才会将其求值为true
示例:
'a' === String #false
及
或
因为
与字符串=='a'
,调用字符串相同。==('a')
,从类#===
模块继承,以测试参数是否从接收器模块继承;及
与'a'===String
相同,后者调用从'a'==(String)
对象继承的
,以测试参数是否等于接收方对象字符串#===
换句话说,
==
是不对称的<代码>对象#==和模块#==
是非常不同的方法。还有Regexp#=
,Proc#==
。。。这也做了非常不同的事情,而且也是不对称的(与模式匹配,使用参数执行)。。不要用它。你是对的,对于类,它被定义为检查右侧是否是实例,但是对于字符串,它被定义为检查相等性。你问这个问题的唯一原因是因为方法名===
和=
彼此相似。请问为什么3/2
与2/3
不同<代码>字符串==='abc'是字符串的同义词。===('abc')
。如果改为将该方法命名为triple_equal
,我们会这样使用它:String.triple_equal('abc')
。请问这是否应该与“abc”相同。三重相等(String)?@AmitKumarGupta,…但是对于String,===…
有点混乱。我知道你指的是两个字符串的比较,但读者可能会认为你的意思是String===“cat”
@JörgWMittag期望一个类似于等式的方法是自反的、对称的和传递的,这是很自然的。如果不是这样的话,这是一种特殊的、反常规的语言,而不是程序员的期望。这是假设OP知道===
首先是用于案例包容的,但是如果OP知道他不会问这个问题。我的评论是关于一种“类似平等”的方法。这显然是OP困惑的根源。对这个问题的回答不是“你难道不知道案例包容是如何工作的吗?”,而是“我明白你为什么会感到困惑,这个看起来与平等有关的东西实际上是指其他东西,有时与平等相一致(=
)
String === 'a' #true
def Foo
end
f = Foo.new
f === Foo #false
Foo === f #true