gpt4 book ai didi

ruby-on-rails - ruby 是_a?对比===

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:47 25 4
gpt4 key购买 nike

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,都提供了它们自己的 === 实现。运算符,也称为大小写相等、三等号或三等号。因为它在每个类中的实现方式不同,所以它的行为会根据调用它的对象的类型而有所不同。通常,如果右边的对象“属于”或"is"左边对象的“成员”,则返回 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 的子类类(class)。 === , is_a?kind_of?如果对象是给定类或任何子类的实例,则方法返回 true。 instance_of?方法更严格,仅当对象是该确切类的实例而不是子类时才返回 true。

is_a?kind_of?方法在 Kernel 中实现模块,由 Object 混入类(class)。两者都是同一方法的别名。让我们验证一下:

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

更多信息请访问 this blog post about ruby operators.

关于ruby-on-rails - ruby 是_a?对比===,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22151204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com