【问题标题】:What's the difference between == and === when comparing 2 object [duplicate]比较2个对象时==和===有什么区别[重复]
【发布时间】:2011-06-27 22:49:27
【问题描述】:

可能重复:
=== vs. == in Ruby

Fixnum == 2.class 
#=> true

Fixnum === 2.class
#=> false

为什么=== 不起作用?我怎么知道方法 .=== 属于(现在我猜它调用了Object#==Object#===),但是我怎样才能确定呢?

【问题讨论】:

  • 我认为== 表示它们具有相同的值,而=== 表示它们是相同的对象?
  • 正如之前在 SO 上多次回答的那样,=== 也考虑了对象的类型。
  • @TyrantWave 和 @Ash -- === 没有类型检查的细节。当它在Object 的子类中被覆盖时。例如,Range#=== 在对象上执行include?。在这种情况下它不关心类型
  • @yozloy 请在提问前搜索 SO。当您输入问题标题时,您会看到大量此类问题已经得到解答。如果您单击其中一个,您就会得到答案。假设我的回答回答了你的问题,请这样标记。我将把@sawa 和@Jörg W Mittag 提供的链接添加到我的答案中

标签: ruby


【解决方案1】:

重复:

大小写相等。请参阅Object#=== 的文档。此方法通常在Object 的子类中被覆盖。例如Module#===:

大小写相等——如果 anObject 是 mod 的实例或 mod 的后代之一,则返回 true。对模块的使用有限,但可用于 case 语句按类对对象进行分类。

>> Module.new === Module
=> false
>> Module === Module.new
=> true

Regexp#=== 是另一个,在这种情况下它是=~ 的同义词:

a = "HELLO"
case a
when /^[a-z]*$/; print "Lower case\n"
when /^[A-Z]*$/; print "Upper case\n"
else;            print "Mixed case\n"
end

IRB 中的一个例子:

>> "a" === /a/
=> false
>> /a/ === "a"
=> true

请记住,第一个返回 false 因为您在 String 上执行 ===,这不是一回事。在第二个示例中,我们在 Regexp 上执行 ===

最后,Range 非常好,它在 Range 对象上调用 include? 并将您的值传递给:

>> (1..100) === 3
=> true
>> (1..100) === 300
=> false

有关这些列表,请查看 RubyDoc.info 核心文档并在左侧框架的方法区域中搜索 ===

【讨论】:

    【解决方案2】:

    == 通常只检查两个参数的值,当 ==== 也检查类型时。

    【讨论】:

    • === 不检查类型,除非其中一个子类已覆盖它以这种方式工作
    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2011-01-23
    • 2011-07-20
    • 2011-01-14
    • 2011-05-26
    • 2014-06-29
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多