确定ruby中对象的类型

时间:2013-04-02 16:49:26

标签: ruby types

我将使用python作为我正在寻找的例子(如果你不懂Python,你可以把它想象成伪代码):

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

我知道在红宝石中我能做到:

1.9.3p194 :002 > 1.class
 => Fixnum 

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

5 个答案:

答案 0 :(得分:503)

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

由于类可以从其他类继承,如果要确定对象是否属于“特定类型”,可以调用object.is_a?(ClassName)来查看object是否为ClassName类型或者从中衍生出来。

通常,类型检查不是在Ruby中完成的,而是基于对象响应特定方法的能力来评估对象,通常称为“Duck typing”。换句话说,如果它响应你想要的方法,就没有理由对这种类型有所了解。

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

答案 1 :(得分:67)

您也可以尝试:instance_of?

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

答案 2 :(得分:38)

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

因此,在许多(如果不是大多数)情况下,最好使用#respond_to?(method)使用Duck打字:

object.respond_to?(:to_i)

答案 3 :(得分:12)

我会说“是”。 正如“马茨”在他的一次谈话中所说的那样, “Ruby对象没有类型。” 不是全部,而是他试图传达给我们的部分。 为什么有人会说 “一切都是对象”呢? 要添加他说“数据有类型不是对象”。

所以我们可能会喜欢这个。

https://www.youtube.com/watch?v=1l3U1X3z0CE

但是Ruby并不关心类的对象类型。 我们使用的类不是类型。然后所有数据都有一个类。

12345.class

'my string'.class

他们也可能有祖先

Object.ancestors

他们也有元类,但我会为你节省详细信息。

一旦你知道了这门课程,你就可以找到你可以使用的方法。这就是需要“数据类型”的地方。 如果你真的想了解详细信息......

“Ruby对象模型”

这是Ruby用于处理对象的术语。这一切都是内部的,所以你并没有真正看到这一点,但很高兴知道。但这是另一个话题。

是的!该类是数据类型。对象具有类,数据具有类型。因此,如果您了解数据库,那么您就知道只有一组有限的类型。

文本块 编号

答案 4 :(得分:0)

variable_name.class

此处变量名称为“ a” a.class