Fixnum == 2.class
#=> true
Fixnum === 2.class
#=> false
为什么===
不起作用?我怎么能知道这个方法===属于(现在我想它会调用Object#==
或Object#===
),但是我怎么能确定它?
Fixnum == 2.class
#=> true
Fixnum === 2.class
#=> false
为什么===
不起作用?我怎么能知道这个方法===属于(现在我想它会调用Object#==
或Object#===
),但是我怎么能确定它?
重复:
案例平等。请参阅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核心文档和搜索===
在方法区域在左侧框架
==通常只检查两个参数的值,当====检查类型时。
'==='不检查类型,除非其中一个子类已经覆盖它以这种方式工作 –
我会假设'=='意味着他们有相同的价值,而'==='意味着他们是同一个对象? – TyrantWave
由于在SO之前已经回答了很多次,'==='也考虑了对象的类型。 –
@TyrantWave和@Ash - '==='没有用于类型检查的细节。当它在'Object'的子类中重写时。例如,'Range#==='在对象上包含'include?'。它不关心在这种情况下的类型 –