Ruby中是否有原始类型?

27

我是一名刚开始学习Ruby的Java开发者。 Ruby有原始类型吗?我找不到它们的列表。如果没有,为什么?


1
我知道这并没有回答你的问题,但如果你不熟悉Ruby,Codecademy上有一个很棒的教程(网址为www.codecademy.com/tracks/ruby)。希望通过学习这些教程,你可以节省很多以后的烦恼时间! - jwarner112
4个回答

40

Ruby的核心原则之一是所有数据都应该表示为对象。其他语言如Smalltalk也遵循类似的范例。

这个设计的好处是使Ruby更加优雅,更容易学习。对象的规则在Ruby中得到了一致的应用。

例如,当初学Java时,原始类型int和包装类Integer之间的差异可能会令初学者感到困惑。通过自动装箱实现的两者之间有时候会产生令人困惑的隐式转换,这种困惑更加严重。

那么,为什么像Java或C#这样的语言还要使用基本类型呢?答案是性能。与原始类型相比,创建对象会带来额外的开销。


2
哇!在一分钟内你写了这么多行代码... :) - Arup Rakshit
1
即使其他编程语言认为的“基本类型”,在Ruby中也是对象。例如:5.object_id5902123.object_id不同。它们是两个不同的Fixnum对象。 - tadman
@VirtualDXS,我不确定你使用的是哪个Ruby版本,但在我的版本中它始终返回相同的值。 - tadman
2
@tadman 您是正确的,我是错误的。字符串的行为就是这样,所以我认为fixnums也会这样。 - Dessa Simpson
1
字符串确实会这样,这就是为什么Ruby有符号构造的原因。如果对象ID匹配,则比较等价性很容易。如果不匹配,则比较字符串需要更多时间。 - tadman
@dbyrne 即使在 C# 中,底层的基本类型也是对象。 - Ashen One

19
Ruby没有原始数据类型。每个值都是一个对象,甚至文字也会转换成对象。
    nil.class  #=> NilClass
   true.class  #=> TrueClass
  'foo'.class  #=> String
   :bar.class  #=> Symbol
    100.class  #=> Integer
   0x1a.class  #=> Integer
0b11010.class  #=> Integer
  123.4.class  #=> Float
1.234e2.class  #=> Float

这使你可以写出优美的代码,例如:

3.times do
  puts "Hello from Ruby"
end

6
引自 关于Ruby 在Ruby中,一切都是对象。每一份信息和代码都可以拥有它们自己的属性和操作。
许多语言中,数值和其他原始类型并不是对象。Ruby遵循Smalltalk语言,赋予所有类型方法和实例变量。这使得使用Ruby更加便利,因为适用于对象的规则适用于Ruby的所有部分。
Java保留了一些原始类型以提高性能,但不可否认,不是每种类型都是一个类,有时会令Java代码显得有些笨拙。Ruby的哲学是让程序员的工作更容易,我认为将一切转化为对象就是实现这一目标的一种方式。

1
“=>”是一个对象吗?在Ruby中,我可以执行1.method(:+).class并获得Method,但是{}.method(:=>).class会出现语法错误。这似乎表明……不是所有东西都是对象? - Ziggy
=> 不是 Hash 上的一个方法。但是 {}.method(:[]).class 返回 Method,正如你所期望的那样。因此,如果你将语法中的奇怪部分、空格、保留字等包括在“everything”中,那么不是 everything 在 Ruby 中都是对象,这有点过分要求了。 - zetetic

3

Ruby没有原始数据类型,因为Ruby是一种纯粹的面向对象语言。基本上,它有像其他语言一样的数据类型,但这些数据类型是类似Java中的集合类。

如果您定义任何字符串值,例如"Akshay",那么它就是一个对象。您可以查看下面的图片,在其中"Akshay"具有对象ID 30300。请单击链接检查Rails控制台上的对象。从图片中的更多示例中,我们可以得出结论:Ruby除关键字外的所有内容都是对象。

Ruby控制台将原始数据类型转换为对象


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接