426

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

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

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

1.9.3p194 :002 > 1.class
 => Fixnum 

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

4

5 回答 5

695

确定对象“类型”的正确方法是调用object.class.

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

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

例如,object.is_a?(String)太死板了,因为另一个类可能会实现将其转换为字符串的方法,或者使其行为与 String 的行为方式相同。object.respond_to?(:to_s)将是一种更好的方法来测试有问题的对象是否符合您的要求。

于 2013-04-02T16:53:39.890 回答
97

你也可以试试:instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True
于 2013-04-02T17:03:58.873 回答
50

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

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

object.respond_to?(:to_i)
于 2013-04-02T16:56:01.640 回答
27

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

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

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

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

12345.class

'my string'.class

他们也可能有祖先

Object.ancestors

他们也有元类,但我会为您保存详细信息。

一旦你知道了这个类,那么你就可以查找你可以为它使用的方法。这就是需要“数据类型”的地方。如果您真的想了解详细信息,请查看...

“Ruby 对象模型”

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

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

文本块数字

于 2016-12-05T17:42:47.613 回答
2

变量名.class

这里变量名是“a” a.class

于 2020-07-24T18:07:52.497 回答