确定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
是否为ClassName
types或从中派生。
通常,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。
文本块数字