2011-06-27 26 views
1

可能重复:
=== vs. == in Ruby2比较对象时,有什么==之间的差异===

Fixnum == 2.class 
#=> true 

Fixnum === 2.class 
#=> false 

为什么===不起作用?我怎么能知道这个方法===属于(现在我想它会调用Object#==Object#===),但是我怎么能确定它?

+0

我会假设'=='意味着他们有相同的价值,而'==='意味着他们是同一个对象? – TyrantWave

+1

由于在SO之前已经回答了很多次,'==='也考虑了对象的类型。 –

+1

@TyrantWave和@Ash - '==='没有用于类型检查的细节。当它在'Object'的子类中重写时。例如,'Range#==='在对象上包含'include?'。它不关心在这种情况下的类型 –

回答

4

重复:

案例平等。请参阅Object#===的文档。这种方法通常在Object的子类中被覆盖。例如,Module#===

Case Equality - 如果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核心文档和搜索===在方法区域在左侧框架

0

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

+0

'==='不检查类型,除非其中一个子类已经覆盖它以这种方式工作 –