Ruby 类的Case语句失败,转换为字符串成功

Ruby 类的Case语句失败,转换为字符串成功,ruby,Ruby,当检查实例类的语句失败时,使用case/。如果将答案实例的类进行如下比较,则会失败: subject = Answer.new case subject.class when Answer true else false end # => false 如果我将Answer实例的类转换为string,它将起作用: subject = Answer.new case subject.class.to_s when 'Answer' true else fa

当检查实例类的
语句失败时,使用
case
/
。如果将
答案
实例的类进行如下比较,则会失败:

subject = Answer.new
case subject.class
when Answer  
  true
else  
  false
end  
# => false
如果我将
Answer
实例的类转换为string,它将起作用:

subject = Answer.new
case subject.class.to_s
when 'Answer'  
  true
else  
  false
end  
# => true
subject.class == Answer
# => true
事情不是这样的,对吧?此外,当我运行一个简单的比较时,它可以工作:

subject = Answer.new
case subject.class.to_s
when 'Answer'  
  true
else  
  false
end  
# => true
subject.class == Answer
# => true

编辑:使用Ruby的
案例
==
的新属性,此代码有效且有效

subject = Answer.new
case subject
when Answer  
  true
else  
  false
end  
# => true

Answer
返回泛型类定义。
Answer.new.class
返回实际实例的哈希值

> Answer
 => Answer(id: integer, created_at: datetime, updated_at: datetime) 
> Answer.new
 => #<Answer id: nil, created_at: nil, updated_at: nil>

上述
案例
翻译为“主题
是否属于
答案
?”。答案是肯定的,因为
subject
answer
的一个实例,Ruby中的
case
基于
=
操作符。如果您有:

case x
when foo
...
when bar
...
end
它的行为是:

if foo === x
   ...
elsif bar === x
   ...
end
在一般意义上,
a===b
意味着
b
属于或被
a
所代表的事物所包含。见给出的定义:

如果obj是mod或 国防部的后代。对模块的使用有限,但可在以下情况下使用 语句按类对对象进行分类

例如,
(2..7)==3
为真,因为3包含在范围
2..7
中。根据对象如何定义
===
2===2
也是正确的,因为
2
属于
2
类。它不是一个交换运算符(例如,
a===b
true并不意味着
b==a
为true)。像
Integer===3
这样的表达式是
true
,因为
3
整数。但是
3===Integer
不是真的,因为
3
并不代表或包含整类
Integer
。因此,
==
操作符使Ruby
case
语句进行一些强大而有用的匹配


在这个特殊的
案例
语句中,您正在检查
答案===subject.class
是否为真。运算符
==
在类对象上的定义方式不会使该
为真
,因为
subject.class
不属于
Answer
类。然而,
s.class==Answer
true
,因为
s.class
确实是
Answer
。所以这个案子不匹配。然而,
Answer===s
是正确的,因为
s
Answer
的一种类型,这与string方法相同,不是吗?我的意思是,答案实例的
.class
方法仍然返回
Answer
(请参阅我问题的最后一个代码块),除了在
case
语句中。我可以用名字来代替,但我觉得不需要只检查一个类是否就是这个类。对不起,在我问题的最后一个代码块中,Ruby确认
subject.class==Answer
是真的-那么为什么在一个条件下是真的而在一个
case
语句中不是真的,哪个应该检查相同的条件?@KristapsA.:“哪个应该检查相同的条件”-这是一个错误的期望
case/when
不是
if/=
的简单替代品。它是一种完全不同的野兽。请参阅@Lougler的答案。@Krisa:我已经更新了我的答案,对发生的事情有了更好的解释。Ruby
case
语句基于
==
运算符。谷歌搜索“ruby triple equal case statement”,你会发现一些有趣的信息来解释你的结果。通过文档链接和一些摘录来增强你的答案()@SergioTulentsev感谢你的链接。我会这么做的。我不知道
==
。然而,
case
语句不应该编译成
foo==x
而应该编译成
x==foo
(据我所知,这在我的使用中是正确的)?或者是考虑到
==
的具体情况的
案例的高级使用?@KristapsA。不。详见我的答案<代码>=
不可交换
x===foo
意味着
foo
属于
x
类,这可能是真的,也可能不是真的。例如,
Integer===3
为真,但
3===Integer
为假(
3
不包含所有
Integer
,只包含一个整数)。啊。谢谢你的澄清!