我将使用python作为我正在寻找的例子(如果你不懂Python,你可以把它想象成伪代码):
>>> a = 1
>>> type(a)
<type 'int'>
我知道在红宝石中我能做到:
1.9.3p194 :002 > 1.class
=> Fixnum
但这是确定对象类型的正确方法吗?
答案 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