【问题标题】:How does the === work in ruby? [duplicate]=== 如何在红宝石中工作? [复制]
【发布时间】:2015-04-05 04:04:35
【问题描述】:

我知道 Class 定义了=== 来测试是否 一个对象就是那个类的一个实例。

现在的问题是,为什么只有当 Class 是左手操作数时才会计算为 true

示例:

'a' === String #false

String === 'a' #true

def Foo
end

f = Foo.new
f === Foo #false
Foo === f #true

【问题讨论】:

  • gilesbowkett.blogspot.com/2007/11/what-is-threequals.html。 TLDR:不要使用它。没错,对于 Class,它被定义为检查右侧是否为实例,但对于 String,=== 被定义为检查相等性。
  • 您问这个问题的唯一原因是因为方法名称===== 彼此相似。你会问为什么3 / 22 / 3 不一样吗? String === 'abc'String.===('abc') 的语法糖。如果将该方法命名为triple_equal,我们将像这样使用它:String.triple_equal('abc')。请问是否应该和'abc'.triple_equal(String)一样?
  • @AmitKumarGupta, ...but for String, ===... 有点令人困惑。我知道您指的是两个字符串的比较,但读者可能会认为您的意思是String === 'cat'
  • @JörgWMittag 很自然地期望类似相等的方法是自反的、对称的 和传递的。如果不是这样,那是 语言 是例外和反传统的,而不是 程序员的期望
  • 假设 OP 知道 === 首先是用于案例归并,但如果 OP 知道他不会问这个问题。我的评论是关于“类似于平等”的方法。这显然是OP混乱的根源。对这个问题的回答不是,“你不知道案例包容是如何工作的吗?”,而是“我明白你为什么感到困惑,这个看起来与平等有关的东西实际上是为了某种东西否则,有时与相等 (==) 相吻合。"

标签: ruby


【解决方案1】:

因为

  • String === 'a'String.===('a')一样,调用Class#===,继承自Module#===,测试参数是否继承自receiver模块;和

  • 'a' === String'a'.===(String)相同,调用String#===,继承自Object#===,测试参数是否等于receiver对象。

换句话说,=== 不是对称的; Object#===Module#=== 是非常不同的方法。还有Regexp#===Proc#===...它们也做非常不同的事情,并且也是不对称的(匹配模式,使用参数执行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2015-03-31
    • 2015-10-21
    • 2012-07-20
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多