ruby - If 语句和 Case 语句 - 不匹配
问题描述
为什么if
语句会起作用,但case
语句不起作用?
class A
end # => nil
a= A.new # => #<A:0x00007fd9d6134770>
If
声明作品
a.class == A # => true
Case
声明不起作用
case a.class # => A
when A
puts "done"
else
puts "else" # => nil
end # => nil
# >> else
我读到 case 语句使用===
运算符而不是==
,我如何使用==
case 语句?
解决方案
该表单case specific when archetype...
将始终使用archetype.===(specific)
包含检查。要使用==
,您需要明确,并使用其他形式case when boolean
:
case
when a.class == A
puts "done"
else
puts "else"
end
但是,在这种特定情况下(检查对象是否属于某个类),如果您不关心a
是 的实例A
还是子类的实例A
(几乎总是如此),您仍然可以使用包含检查,像这样:
case a # Note: not a.class
when A
puts "done"
else
puts "else"
end
因为A === a
when A
is a class 几乎与a.is_a?(A)
. 请注意,这与 不同,如果是 的子类的实例,a.class == A
则不会成立。例如对于, 和, 两者和都是假的, 但两者和都是真的。)a
A
class Dog < Animal
fido = Dog.new
fido.instance_of?(Animal)
fido.class == Animal
fido.is_a?(Animal)
Animal === fido
推荐阅读
- javascript - 如何绕过firebase在响应时给出的数组中的随机ID?
- python-3.x - Flask-Bokeh 服务器:退出时释放内存
- mysql - 将 MySQL 表导出到 Microsoft SQL 服务器
- amazon-web-services - AWS批量限制单个主机上的容器数量
- vba - 复制和替换命名范围 Excel VBA
- android - 无法解析配置 ':app:debugRuntimeClasspath' 的所有依赖项
- sql - 基于层次结构的数据透视
- mdx - PowerPivot Query 上的 Filter() 太慢
- sql - 了解 VBA 以连接到 SQL
- python - 在存储在数据库中的时间运行周期性任务