由于 Ruby 跟 C/C++ 的差异实在太大,很难将两者间的差异一项一项列出。其中的一个重要理由是:Ruby 和 C 语言的「不隐藏内部机制(No hidden mechanism)」原则完全处在两个极端上。Ruby 选择让人们的工作更轻松,但让执行期环境(runtime)负担加重。除非你要开始对你的 Ruby 程序代码做最佳化,你不需要关心编译器的脸色如何。
也就是说,你可以预期 Ruby 程序将会比等价的 C/C++ 程序慢的多。然而,你也会惊讶于只需要写这么少的程序代码,就可以迅速地完成你的 Ruby 程序。Ruby 能完全满足你的需求,又比C++简单的多。
Ruby 是动态型别(Dynamically typed),而不是静态型别(Statically typed)的程序语言。Ruby的执行期环境(runtime)会尽可能的处理所有工作。举例来说,你不需要事先知道你的 Ruby 程序将会被连结(link)到哪一个模块,或是哪一个方法(method)将会被呼叫。
幸运的是,Ruby 与 C 有着良好的共生关系。Ruby 支持所谓的「扩充模块」。这些由 C 语言写成的模块能够在 Ruby 程序中使用(而且看起来与一般 Ruby 模块无异)。因此,你可以将你的 Ruby 程序中影响效能最大的部份划分出去,用纯粹的 C 语言来完成这些部分。
最后,Ruby 本身理所当然的是用 C 语言写成。
与C语言的相似之处
与C语言相同,在Ruby中...
- 你可以用程序式的方式写程序(但是底层依然是对象导向的环境。)
- 大多数的运算子都是相同的。(包含复合运算子跟位运算子。)然而Ruby并没有++或是--运算符。
- 你可以使用__FILE__ 与 __LINE__。
- 你可以定义常数。虽然并没有特殊的 const 关键词,Ruby利用命名的惯例来强迫变数为常数:第一个字母为大写的变量便为常数。
- 字符串由双引号包住。
- 字符串是可变的。
- 就像man page一样,你可以利用ri指令在终端机窗口中阅读大多数的文件。
- 你也有一样的命令行调试器可以使用。
与C++的相同之处
与C++相同,在Ruby中...
- 大多数的运算符都是一样的(包含::),<<常常用来将元素串接在list之后。要注意的是:Ruby中你不需要使用->,永远只需要.。
- public,private,与protected的功能在两者是类似的。
- 对象的继承一样只需要一个字符,只是从 : 变成 <。
- 可以将你的程序代码放进模块(module)之中,类似 C++ 中的 namespace 的作法。
- 例外(Exceptions)的运作方式类似。虽然为了保护无辜的人们,我们把关键词改了。
与C语言的不同之处
与C语言不同的是,在Ruby中...
- 物件是强类型。(变量名称则没有任何的类型定义。)
- 没有宏(macro)或是预处理器(preprocessor)、没有typedef、没有sizeof,也没有enum。
- 没有头文件(.h)、没有typedef、没有sizeof、也没有enum。
- 没有#define。用常数来代替他们便可。
- 在Ruby 1.8中,程序代码在执行期才被解译,而不是被编译成任何一种机械语言或是byte-code。
- 所有的变量都存放在堆栈(heap)中。因此,你不需要自行释放他们,垃圾回收机制(Garbage collector)会处理他们。
- 方法的参数是传引用,而非传值。
- 用 require 'foo' 而不是 #include <foo> 或是 #include "foo"。
- 你不能在程序代码中插入汇编语言。
- 每行的结尾不需要分号(例外:如果要在同一行内写多个语句,那就需要分号把它们分隔开)。
- 在 if 和 while 这类条件表达式中,你可以省略括号。
- 调用方法时,括号通常是选择性的。
- 你不会常常使用大括号。一般只需要使用 end 关键词来结束一个多行的区块(像是 while 循环。)
- do关键词被称作「block」,Ruby中没有C语言的「do statement。」
- 「block」这个词在 Ruby 中有着不同的意义。它是指一段可以结合到一个方法调用的程序代码,使得该方法体在执行时可以呼叫这段程序代码。
- 你不需要事先声明变量,当你需要一个变量时直接使用一个新名字就可以了。
- 当测试真值的时候,除了 false 与 nil 之外的东西都视为真(包含 0,0.0,以及"0"。)
- Ruby没有字符(char)型别,只有长度为一的字符串。
- 字符串并不需要一个空字节作为结束。
- 数组声明使用中括号而非大括号。
- 当你加入更多元素到数组中时,数组会自动变大。
- 如果你将两个数组相加,你会得到一个更大的新的数组,而不是指针运算的结果。
- 大多数的情况下,一切都是一个表达式。(也就是说,while之类的东西实际上会被当做一个右值。)
与C++的不同
与C++不同的是,在Ruby中...
- 你不能明确的定义引用(reference),Ruby中每个变量都会被自动解参照回原本的对象。
- 对象型别是强型别也是动态型别。Ruby执行期环境将会在执行期的方法呼叫成功时,自行辨识型别。
- 对象的建构子用 initialize 命名,而不是类别名称。
- 所有的方法都是虚拟(virtual)的。
- 类别变量(静态变量)的变量名称永远用 @@开头。
- 你不能直接存取成员变量――所有公开的成员变量(在Ruby中称作属性, attribute)都得通过方法访问。
- 用self取代this。
- 有些方法会以 ’?’ 或是 ’!’结尾,这些符号都真的存在于方法名称中。
- 本质上,Ruby没有多重继承。然而,Ruby可以使用”mixin”。(也就是说,你可以「继承」某个模块的所有方法)
- 呼叫方法时的括号通常都可以省略。
- 你可以在任何时候重新打开一个类别以加入新的方法。
- 你不需要 C++ 的 template 机制。(因为你可以将某个变量设值为任何一种对象,型别将在执行期自动辨识。)你也不需要转型。
- 迭代(Iteration)的运作方式有些许不同,Ruby中你会让你的对象mixinEnumerator模块并且直接呼叫 my_obj.each 方法,而不是使用一个独立的迭代器(Iterator)。
- Ruby只有两种容器类别:Array跟Hash。
- Ruby没有类型转换,你也会发现在Ruby中你不需要它们。
- Ruby内建了多线程机制。但是在Ruby 1.8之中只有”green threads”(只在解释器中有效的线程),而不是原生的线程。
- Ruby的标准函式库中就包含了单元测试(Unit test)函式库。
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-c-and-c-/
http://www.ruby-lang.org/zh_TW/documentation/ruby-from-other-languages/to-ruby-from-c-and-c-/