确定ruby中对象的类型

Zip*_*oli 338 ruby types

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

>>> a = 1
>>> type(a)
<type 'int'>
Run Code Online (Sandbox Code Playgroud)

我知道在红宝石中我能做到:

1.9.3p194 :002 > 1.class
 => Fixnum 
Run Code Online (Sandbox Code Playgroud)

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

tad*_*man 561

确定对象"类型"的正确方法是调用Ruby,这是Ruby世界中一个不稳定的术语object.class.

由于类可以从其他类继承,因此如果要确定对象是否属于"特定类型",则可以调用object.is_a?(ClassName)以查看object是类型ClassName还是派生类型.

通常,类型检查不是在Ruby中完成的,而是基于对象响应特定方法的能力来评估对象,通常称为" 鸭子打字 ".换句话说,如果它响应您想要的方法,则没有理由对该类型有所了解.

例如,object.is_a?(String)太严格了,因为另一个类可能实现将其转换为字符串的方法,或使其行为与String的行为方式相同.object.respond_to?(:to_s)将是一个更好的方法来测试相关对象做你想要的.

  • @JörgWMittag:我不同意."类"和"处理器速度"(选择一个例子)是两个完全不同的概念,但"类"和"类型"是密切相关的概念.例如,[维基百科关于类的文章](http://en.wikipedia.org/wiki/Class_%28computer_programming%29)说:"在面向对象的编程中,类是用于定义的构造一种独特的类型." 塔德曼对提问者有所帮助. (73认同)
  • @JörgWMittag在Ruby中,与C,JavaScript和其他类似的`typeof`最接近的是`class`.Ruby中没有正式的协议系统,就像其他语言一样,Objective-C是最接近它的Smalltalk.如果您将"类型"定义为"响应特定方法集并具有可接受结果的对象",那么实际上没有办法断言.它太宽松了.在引用对象类型时,大部分时间都在Ruby中,它被理解为你在谈论类.出于这个原因,我确实在引号中使用了术语类型. (18认同)
  • @JörgWMittag:我继续声称"类"和"类型"在OO中肯定不是完全不同的概念,如引用所示.(另外:你如何在Java中声明一个变量?通过给*变量的***或*类*,后跟其名称:"`int i`"或"`Integer j`".) tadman以一种似乎满足提问者和普通读者的方式回答了这个问题,同时澄清了Ruby使用的术语.我没有兴趣在面向对象术语的细节上进行学术分裂,所以请说清楚. (14认同)
  • -1.`#class`执行*not*返回对象的类型,它返回它的*class*.这个名字应该是一个死的赠品.类和类型是OO中两个完全*不同的概念. (13认同)
  • @TeemuLeisti这里的大部分问题都来自于*Ruby中的所有*都是一个对象,因此有一个类,而在几乎所有其他语言中都存在原始的*类型*,它们不是对象而且没有类,相比之下做的对象.当没有纯粹类型的东西,并且无法正式定义它时,Ruby世界中的含义变得特别模糊.除了他自己以外,马茨并没有严格遵守任何特定的思想流派. (11认同)
  • @TeemuLeisti:至少从 1970 年代开始,人们就已经很好地理解了这一点。例如,参见 JC Reynolds 在算法语言新进展中的 *用户定义的类型和过程数据结构作为数据抽象的补充方法,INRIA,1975 年或 [*On Understanding Data Abstraction,Revisited* by William R.Cook](http ://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf) (2认同)
  • @JörgWMittag我读了您发表的文章,问题是论文中提到的ruby没有类型或(ADT)。您所说的“类型”和“类”完全不同的说法在这种情况下是错误的,因为在Ruby中,所有内容都是类,即使您称之为类型。整数,字符串,浮点数等都是Ruby中的类。这就是为什么塔德曼是正确的。您可以进行类型检查的CLOSEST使用该类作为参考。在Javascript,C,C ++等语言中,您的陈述将是100%正确和有效的,因为这些语言确实具有“类”和“ ADT”。 (2认同)

Aru*_*hit 73

你也可以尝试: instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True
Run Code Online (Sandbox Code Playgroud)

  • 在许多情况下非常有用的解决方 谢谢! (2认同)

Stu*_*t M 42

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

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

object.respond_to?(:to_i)
Run Code Online (Sandbox Code Playgroud)

  • @user566245 那么它responds_to?(:the_question),但就像你说的,它没有回答问题,只是提供相关信息。非常肯定的答案需要回答问题。 (2认同)

Dou*_*len 15

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

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

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

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

12345.class

'my string'.class
Run Code Online (Sandbox Code Playgroud)

他们也可能有祖先

Object.ancestors
Run Code Online (Sandbox Code Playgroud)

他们也有元类,但我会为你节省详细信息.

一旦你知道了这门课程,你就可以找到你可以使用的方法.这就是需要"数据类型"的地方.如果你真的想深入了解详细信息......

"Ruby对象模型"

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

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

文本块数字


Faz*_*zal 5

变量名.类

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


小智 5

每个变量都有一个名为 class 的 prop。如果你打印它,它会告诉你它是什么类型。所以这样做:

puts a.class
Run Code Online (Sandbox Code Playgroud)