在Ruby中,==和===之间有什么区别?该RDoc的说
Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写以在case语句中提供有意义的语义.
是#==
一样的==
吗?你能举例说明在case语句中何时/如何使用它?
Jör*_*tag 124
这两者真的无关.特别是,#==
是等于运算符,并且#===
与平等完全没有关系.就个人而言,我发现#===
看起来非常不幸,看起来非常相似#==
,使用等号并且通常称为大小写等于运算符,三等于运算符或三等运算符,它实际上与平等无关.
我打电话#===
给案件包含操作员(这是我能想到的最好的,我愿意接受建议,特别是来自母语为英语的人).
最好的描述方式a === b
是"如果我标有抽屉a
,放入b
它是否有意义?"
所以,例如,Module#===
测试是否b.is_a?(a)
.如果你有Integer === 2
,那么放入2
一个贴有标签的盒子是否合理Integer
?是的,它确实.怎么样Integer === 'hello'
?显然不是.
另一个例子是Regexp#===
.它测试一场比赛.放入'hello'
贴有标签的盒子是否有意义/el+/
?是的,它确实.
对于诸如范围之类的集合,Range#===
定义为成员资格测试:如果该元素在集合中,则将元素放在标有集合的框中是有意义的.
所以,这就是#===
:它测试参数是否可以归入接收器.
case
表达式有什么作用?简单:
case foo
when bar
baz
end
Run Code Online (Sandbox Code Playgroud)
是相同的
if bar === foo
baz
end
Run Code Online (Sandbox Code Playgroud)
sep*_*p2k 10
是的,#==
文档的意思是" ==
当前对象的实例方法".
===
用于case语句中:
case obj
when x
foo
when y
bar
end
Run Code Online (Sandbox Code Playgroud)
是相同的
if x === obj
foo
elsif y === obj
bar
end
Run Code Online (Sandbox Code Playgroud)
一些定义自己的类===
是Range(表现得像include?
),Class(表现得像obj.is_a?(klass)
)和Regexp
(=~
除了返回布尔值之外的行为).一些没有定义自己===
的类是数字类和String.
所以
case x
when 0
puts "Lots"
when Numeric
puts(100.0 / x)
when /^\d+$/
puts(100.0 / x.to_f)
default
raise ArgumentError, "x is not a number or numeric string"
end
Run Code Online (Sandbox Code Playgroud)
是相同的
if 0 == x
puts "Lots"
elsif x.is_a? Numeric
puts(100.0 / x)
elsif x =~ /^\d+$/
puts(100.0 / x.to_f)
else
raise ArgumentError, "x is not a number or numeric string"
end
Run Code Online (Sandbox Code Playgroud)
有趣的事实,===
也用于匹配异常rescue
这是一个例子
class Example
def self.===(exception)
puts "Triple equals has been called."
true
end
end
raise rescue Example
# => prints "Triple equals has been called."
# => no exception raised
Run Code Online (Sandbox Code Playgroud)
这用于匹配系统错误。
SystemCallError.===
已定义为当两者具有相同的 errno 时返回 true。使用此系统调用错误编号相同的错误,例如Errno::EAGAIN
和Errno::EWOULDBLOCK
,都可以通过仅列出其中之一来挽救。
归档时间: |
|
查看次数: |
18528 次 |
最近记录: |