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
。因此,==
操作符使Rubycase
语句进行一些强大而有用的匹配
在这个特殊的案例
语句中,您正在检查答案===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:我已经更新了我的答案,对发生的事情有了更好的解释。Rubycase
语句基于==
运算符。谷歌搜索“ruby triple equal case statement”,你会发现一些有趣的信息来解释你的结果。通过文档链接和一些摘录来增强你的答案()@SergioTulentsev感谢你的链接。我会这么做的。我不知道==
。然而,case
语句不应该编译成foo==x
而应该编译成x==foo
(据我所知,这在我的使用中是正确的)?或者是考虑到==
的具体情况的案例的高级使用?@KristapsA。不。详见我的答案<代码>=
不可交换x===foo
意味着foo
属于x
类,这可能是真的,也可能不是真的。例如,Integer===3
为真,但3===Integer
为假(3
不包含所有Integer
,只包含一个整数)。啊。谢谢你的澄清!