我将使用 python 作为我正在寻找的示例(如果您不了解 Python,可以将其视为伪代码):
>>> a = 1
>>> type(a)
<type 'int'>
我知道在红宝石中我可以做到:
1.9.3p194 :002 > 1.class
=> Fixnum
但这是确定对象类型的正确方法吗?
确定对象“类型”的正确方法是调用object.class
.
由于类可以从其他类继承,如果您想确定一个对象是否“属于特定类型”,您可以调用object.is_a?(ClassName)
以查看是否object
属于类型ClassName
或派生自它。
通常在 Ruby 中不进行类型检查,而是根据对象对特定方法的响应能力来评估对象,通常称为“鸭子类型”。换句话说,如果它响应您想要的方法,则没有理由特别关注类型。
例如,object.is_a?(String)
太死板了,因为另一个类可能会实现将其转换为字符串的方法,或者使其行为与 String 的行为方式相同。object.respond_to?(:to_s)
将是一种更好的方法来测试有问题的对象是否符合您的要求。
你也可以试试:instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
通常在 Ruby 中,您实际上并不关心对象的类本身是什么,您只关心它是否响应某个方法。这被称为Duck Typing,您会在各种 Ruby 代码库中看到它。
因此,在许多(如果不是大多数)情况下,最好使用 Duck Typing 使用#respond_to?(method)
:
object.respond_to?(:to_i)
我会说“是”。正如“Matz”在他的一次演讲中所说的那样,“Ruby 对象没有类型”。不是全部,而是他试图传达给我们的部分。那么为什么有人会说“一切都是对象”呢?添加他说“数据有类型而不是对象”。
所以我们可能会喜欢这个。
https://www.youtube.com/watch?v=1l3U1X3z0CE
但是 Ruby 并不关心对象的类型,只关心类。我们使用类而不是类型。然后所有数据都有一个类。
12345.class
'my string'.class
他们也可能有祖先
Object.ancestors
他们也有元类,但我会为您保存详细信息。
一旦你知道了这个类,那么你就可以查找你可以为它使用的方法。这就是需要“数据类型”的地方。如果您真的想了解详细信息,请查看...
“Ruby 对象模型”
这是用于 Ruby 如何处理对象的术语。这都是内部的,所以你并没有真正看到很多,但很高兴知道。但这是另一个话题。
是的!类是数据类型。对象有类,数据有类型。因此,如果您了解数据库,那么您就会知道只有一组有限的类型。
文本块数字
变量名.class
这里变量名是“a”
a.class