加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby is_a? vs ===

发布时间:2020-12-17 03:55:53 所属栏目:百科 来源:网络整理
导读:is_a有什么区别?和===? 运行此代码: puts myObj.classputs myObj.is_a?(Hash)puts myObj === Hash #Curious puts Hash === myObj 输出: Hashtruefalse #Why?true 解决方法 许多Ruby的内置类,如String,Range和Regexp,都提供了自己的===运算符实现,也称为c
is_a有什么区别?和===?

运行此代码:

puts myObj.class
puts myObj.is_a?(Hash)
puts myObj === Hash   #Curious 
puts Hash  === myObj

输出:

Hash
true
false        #Why?
true

解决方法

许多Ruby的内置类,如String,Range和Regexp,都提供了自己的===运算符实现,也称为case-equality,triple equals或threequals.因为它在每个类中的实现方式不同,所以它的行为会有所不同,具体取决于调用它的对象类型.通常,如果右侧的对象“属于”或“是左侧对象的成员”,则返回true.例如,它可用于测试对象是否是类(或其子类之一)的实例.

String === "zen"  # Output: => true
Range === (1..2)   # Output: => true
Array === [1,2,3]   # Output: => true
Integer === 2   # Output: => true

使用可能最适合工作的其他方法可以获得相同的结果.通常,在不牺牲效率和简洁性的情况下,通过尽可能明确地编写易于阅读的代码通常会更好.

2.is_a? Integer   # Output: => true
2.kind_of? Integer  # Output: => true
2.instance_of? Integer # Output: => false

请注意,最后一个示例返回false,因为2之类的整数是Fixnum类的实例,它是Integer类的子类. ===,is_a?和kind_of?如果对象是给定类或任何子类的实例,则methods返回true. instance_of?方法更严格,只有当对象是该确切类的实例而不是子类时才返回true.

is_a?和kind_of?方法在内核模块中实现,内核模块由Object类混合.两者都是同一方法的别名.我们来验证:

Kernel.instance_method(:kind_of?) == Kernel.instance_method(:is_a?)
# Output: => true

更多信息,请点击this blog post about ruby operators.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读