Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
===在ruby中是如何工作的?_Ruby - Fatal编程技术网

===在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