c语言与ruby,从 C 和 C++ 到 Ruby

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

从 C 和 C++ 到 Ruby

由於 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指令在终端机视窗中阅读大多数的文件。

你也有一样的指令列debugger可以使用。与C++的相同之处与C++相同,在Ruby中...

大多数的运算子都是一样的(包含::),<,永远只需要.。

public,private,与protected的功能在两者是类似的。

物件的继承一样只需要一个字元,只是从 : 变成

可以将你的程式码放进模组(module)之中,类似 C++ 中的namespace 的作法。

例外(Exceptions)的运作方式类似。虽然为了保护无辜的人们,我们把关键字改了。与C语言的不同之处与C语言不同的是,在Ruby中...

物件是强型别。(变数名称则没有任何的型别定义。)

没有巨集(macro)或是前处理器(preprocessor)、没有转型、没有指标。

没有标头档(header files)、没有typedef、没有sizeof、也没有enums。

没有#define。用常数来代替他们便可。

在Ruby 1.8中,程式码在执行期才被解译,而不是被编译成任何一种机械语言或是byte-code。

所有的变数都存放在堆叠(heap)中。因此,你不需要自行释放他们,垃圾回收机制(Garbage collector)会处理他们。

方法的参数是传参考,而非传值。

用 require 'foo' 而不是 #include 或是 #include "foo"。

你不能在程式码中插入组合语言。

每行的结尾不需要分号。

在 if 和 while 这类条件运算式中,你可以省略括号。

呼叫方法的括号通常是选择性的。

你不会常常使用大括号。一般只需要使用 end 关键字来结束一个多行的区块(像是 while 回圈。)

do关键字被称作「block」,Ruby中没有C语言的「do statement。」

「block」这个词在 Ruby 中有著不同的意义。它是指一段可以结合到一个方法呼叫的程式码,使得该方法的本体在执行时可以呼叫该段程式码。

你不需要事先宣告变数,当你需要一个变数时直接使用一个新名字就可以了。

当测试真值的时候,除了 false 与 nil 之外的东西都视为真(包含0,0.0,以及"0"。)

Ruby没有字元(char)型别,只有长度为一的字串。

字串并不需要一个空位元组作为结束。

阵列宣告使用中括号而非大括号。

当你加入更多元素到阵列中时,阵列会自动变大。

如果你将两个阵列相加,你会得到一个更大的新的阵列,而不是指标运算的结果。

大多数的情况下,一切都是一个运算式。(也就是说,while之类的东西实际上会被当做一个rvalue。)与C++的不同与C++不同的是,在Ruby中...

你不能明确的定义参照(reference),Ruby中每个变数都会被自动解参照回原本的物件。

物件型别是强型别也是动态型别。Ruby执行期环境将会在执行期的方法呼叫成功时,自行辨识型别。

物件的建构子用 initialize 命名,而不是类别名称。

所有的方法都是虚拟(virtual)的。

类别变数(静态变数)的变数名称永远用 @@开头。

你不能直接存取成员变数,所有对公开的成员变数(在Ruby中称作属性, attribute)的存取都会透过方法呼叫。

用self取代this。

有些方法会以 ’?’ 或是 ’!’结尾,这些符号都真的存在於方法名称中。

本质上,Ruby没有多重继承。然而,Ruby可以使用”mixin”。(也就是说,你可以「继承」某个模组的所有方法)

呼叫方法时的括号通常都可以省略。

你可以在任何时候重新打开一个类别以加入新的方法。

你不需要 C++ 的 template 机制。(因为你可以将某个变数设值为任何一种物件,型别将在执行期自动辨识。)你也不需要转型。

迭代(Iteration)的运作方式有些许不同,Ruby中你会让你的物件mixin Enumerator模组并且直接呼叫 my_obj.each 方法,而不是使用一个独立的迭代器(Iterator)。

Ruby只有两种容器类别:Array跟Hash。

Ruby没有型别转换,你也会发现在Ruby中你不需要它们。

Ruby内建了多执行绪。但是在Ruby 1.8之中只有”green threads”(只在直译器中有效的执行绪),而不是原生的执行绪。

Ruby的标准函式库中就包含了单元测试(Unit test)函式库。

http://www.ruby-lang.org/zh_TW/documentation/ruby-from-other-languages/to-ruby-from-c-and-c-/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值