在ruby中确定对象的类型

我将使用python作为我正在寻找的示例(如果你不了解python,你可以将其视为伪代码):

>>> a = 1
>>> type(a)
<type 'int'>

我知道在红宝石我可以做:

1.9.3p194 :002 > 1.class
=> Fixnum

但这是确定对象类型的正确方法吗?

628495 次浏览

确定对象的“类型”的正确方法是调用object.class,对象的“类型”在Ruby世界中是一个不稳定的术语。

由于类可以从其他类继承,如果你想确定一个对象是否“属于特定类型”,你可以调用object.is_a?(ClassName)来查看object是否属于ClassName类型或从它派生出来。

通常在Ruby中不进行类型检查,而是根据对象对特定方法(通常称为“Duck typing”)的响应能力来评估对象。换句话说,如果它响应您想要的方法,就没有理由对类型特别要求。

例如,object.is_a?(String)过于严格,因为另一个类可能实现将其转换为字符串的方法,或者使其行为与string行为相同。object.respond_to?(:to_s)将是一个更好的方法来测试对象是否做了你想要的。

通常在Ruby中,你并不关心对象的类是什么,本质上,你只关心它对某个方法的响应。这被称为Duck Typing,你会在各种Ruby代码库中看到它。

所以在许多(如果不是大多数)情况下,最好使用#respond_to?(method)来使用Duck Typing:

object.respond_to?(:to_i)

你也可以试试:instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True

variable_name.class

这里变量名是"a" a.class < / p >

每个变量都有一个名为类的道具。如果你打印它,它会告诉你它是什么类型。所以这样做:

puts a.class