确定ruby中物体的types

我将使用python作为我正在寻找的一个例子(如果你不知道Python,你可以把它看作伪代码):

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

我知道我可以做的ruby:

 1.9.3p194 :002 > 1.class => Fixnum 

但是,这是确定对象types的正确方法吗?

确定一个对象的“types”的正确方法是在Ruby世界中是一个摇摆不定的术语,即调用object.class

由于类可以从其他类inheritance,如果要确定对象是否为“特定types”,则可以调用object.is_a?(ClassName)来查看object是否为ClassNametypes或从中派生。

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

例如, object.is_a?(String)过于僵化,因为另一个类可能实现将其转换为string的方法,或者使其行为与string的行为相同。 object.respond_to?(:to_s)将是一个更好的方法来testing有问题的对象做你想要的。

你也可以尝试: instance_of?

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

通常在Ruby中,实际上并不关心对象的类是什么,它只是在乎它是否响应某种方法。 这就是所谓的鸭子打字 ,你会看到它在各种Ruby代码库。

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

 object.respond_to?(:to_i) 

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

所以我们可能会喜欢这个

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

但是Ruby并不关心类的types。 我们使用不是types的类。 所有的数据,然后有一个类。

 12345.class 'my string'.class 

他们也可能有祖先

 Object.ancestors 

他们也有元class,但我会保存你的细节。

一旦你知道了课程,那么你将能够查找你可以使用它的方法。 这就是需要“数据types”的地方。 如果你真的想深入细节查找…

“Ruby对象模型”

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

是! 该类是数据types。 对象有类,数据有types。 所以,如果你知道数据库,那么你知道只有一组有限的types。

文本块数字