赞 | 342 |
VIP | 10 |
好人卡 | 8 |
积分 | 258 |
经验 | 235776 |
最后登录 | 2025-2-11 |
在线时间 | 2354 小时 |
Lv5.捕梦者 (版主) 遠航の猫咪
- 梦石
- 3
- 星屑
- 22764
- 在线时间
- 2354 小时
- 注册时间
- 2005-10-15
- 帖子
- 1161

|
疯狂的石头,文静的丫头——浅说Ruby语言
文/SailCat
一. 疯狂的石头
1995年7月,一个日本的程序天才Yukihiro Matsumoto,结合Perl、Python、Java等语言的长处,发明了一种完全面象对象的脚本式编程语言,他用7月的幸运石——红宝石,将其命名为Ruby。然而,这枚红宝石却在泥潭中沉睡了8年之久,在那个编程语言借网络普及之势如雨后春笋一般出现的日子里,Ruby似乎并没有太多的被人记起。2000年那本著名的《Programming Ruby》的出现,仅仅是点亮了一盏明灯,却并未能映得宝石光芒四射。
Web 2.0的网络编程世界,就像一个大舞台,各种角色来了又走,经过跨世纪的漫长沉睡,最近的三年来,Ruby因其独到的特性,渐渐地被人从泥潭中挖掘出来,2004年7月,就在Ruby九周岁生日那年,借着Rails框架大行起道的春风,Ruby着着实实风光了一把。在2007年第一季度的全球十大编程语言排行榜上,Ruby比前一季度上升了11位,直接窜升到第十的位置,而在它前面的,几乎无一例外是C++、VB、Java这样的“大腕级”语言。除了Ruby on Rails一家独大,把持着Ruby语言几近70%的应用领地之外,Ruby in Emacs也开始成为新兴的应用。而对于游戏开发的爱好者来说,RGSS的出现,令RPG Maker XP这个业余级的游戏开发工具仿佛一夜之间点燃一场大火,将她的前辈们RPG Maker 2000、2003原本占据的地盘,一下子烧的只剩下焦土。与其说是RPG Maker XP带来了RGSS这一新的应用平台,倒不如说是RGSS推广了RPG Maker XP,带来了RM界的一场革命,放眼国内外的RM论坛,已很难再看到2000、2003的影子,取而代之的是如火如荼的关于某种游戏效果的Ruby算法实现的讨论。
Ruby,这枚“疯狂的石头”,着实火火的疯狂了一把。
二. 重剑无锋,大巧不工
Ruby的流行,和它本身的语言特性是分不开的。
OO思想的编程语言不可谓不多,从C++,到Java,到Delphi,再到新兴一代的C#和VB.net,无一不深深的刻着OO的烙印。然而Ruby却仿佛是天生为OO打造的一般,无限递归,完全接近自然语言的“元语言”式结构,使得Ruby相较于那些以大括号打天下的语言,如Java,减少了近30%的代码量。对正规表达式、sprintf的完善支持,使得Ruby在处理文本方面有着得天独厚的优势。脚本语言、弱类型变量、无需编译器的特点,更是让Ruby在中小型应用中显得得心应手(相较之下,VB、C#那种动辙数G的IDE开发界面就笨拙了很多)。当Ruby被内嵌于Rails、Emacs、RPG Maker中,并可以自由操作程序的对象时,那种插上翅膀飞翔的感觉,便深深地印在了每一个Programmer的心里。无怪乎Ruby的官方网站上,那个闪亮的红色石头下方,是醒目的“A Programmer’s Best Friend”字样。
同VC++之类相比,Ruby作为脚本式编程语言确实有着不可替代的优越性。但即便是在脚本语言这个家族谱系上,Ruby也有着JavaScript、Python、Perl、VBScript等一干兄弟姐妹。Ruby是这样一种语言:它比JavaScript简洁,比Python结构化,比Perl易懂,比VBScript健壮,也许它不一定是最好的,但是你不可否认它是很好的。
比JavaScript简洁——Ruby生就不是一个类C系的语言——除了运算符。在Ruby中,除开Hash字面量、迭代块、以及某些具有不良习惯的程序员书写的不分行代码,你几乎很难看到大括号和分号这种东西在Ruby里出现。
比Python结构化——同样是放弃了大括号,Python使用Tab缩进来表达结构,相比于Tab在不同编辑器各有区别的显示方式,Ruby那种用end来终结上一级结构的递归写法无疑使程序的可读性更通畅。
比Perl易懂——也许是我理解能力有限,但Perl那种使用符号使用的比C还厉害的脚本语言,确实让我非常头疼,而Ruby那种几乎接近自然语言的描述风格——这也是Ruby“基于表达式”的特性,让Ruby写成的代码使人读起来异常的舒服。
比VBScript健壮——同样不是类C的语言,同样是自然风格的程序代码,但是VBScript被所有人诟病的安全性让人害怕了,没有异常处理,没有完善和安全的API封装调用(在 VBScript中一旦建立了API对象集你几乎可以为所欲为),没有……相比于处处让人感觉“贴心、安心、舒心”的Ruby,VBScript差的实在太多了。你听说过用Ruby编写的病毒吗?
Ruby全套语言只有区区39个关键字,这是它的弱类型特性和基于表达式的简洁性所决定的。没有哪个语言有Ruby这么少的关键字,那种强类型的编译型面向对象语言通常会让人记关键字记到吐血(为了OO而OO的VB.net居然创记录的有207个关键字,以至于MS不得不允许开发人员在VB.net中使用关键字命名变量),简洁的匈牙利命名法使得Ruby的常量、变量、方法、属性、对象等等都有着自己特定而易懂的标记(相比,C++中对象属性居然还有.和->两套符号就有点让初学者不知所云了)。关键字虽少,但该有的功能可一样都不缺,像异常处理,分歧,循环,迭代,选择等结构,Ruby都一应俱全的支持。
正是这种“重剑无锋,大巧不工”的特性,使得Ruby在Web 2.0的脚本语言竞争中脱颖而出。
三. 动态的语言,轻盈的指尖
只有Ruby这种纯动态的语言,才会让人在写代码的时候感受到“行云流水”的舒坦,指尖轻盈地敲着键盘,蹦出的仿佛不再是冷冰冰的机器语言,而是优美的旋律一般。
面向对象的理念使得任何东西在Ruby语言中都成了对象。连表达式也不例外,当我在RGSS的一个例程里看到self.hp -= damage unless damage==nil这种写法的时候。我完全惊讶于Ruby这种简洁的表达能力。因为同样的东西你如果想在JavaScript里实现的话,只能 if (!(damage==nil)) {this.hp-=damage;}。我非常惊讶于开发Ruby的那个天才是怎么想出unless这个东东的——因为对于一些复杂的逻辑表达式来说,考虑And/Or/Not的先后顺序曾经是我非常头疼的东西——也是程序里最容易出错的地方。而更让人惊讶的是这种条件结构竟然可以放在一个表达式的后面,这就是真正的“脚本”,就像戏里台词的脚本一样:“我不能把东西给你,除非……”,这不活脱脱是这种行内unless表达式的翻版么。
Ruby对程序员的贴心到了极致,因为逻辑容易出错,Ruby便提供了&&/||/!与and/or/not两套完全对等但优先级不一样的逻辑运算符。无论你来自类C语言的大家族,还是那少数异类(Delphi/Basic/FoxPro等),都可以在书写Ruby的表达式时找到你习惯的痕迹。
记得初学VB的时候,function/sub/property(函数,方法,属性)泾渭分明的特点着实让人糊涂了一把——有必要强调成这样吗?类C语言是通过有没有返回值来区分方法和其他两个,再通过有没有参数签名来区分函数和属性,“过度”智能化的同时,却又带来一些不必要的麻烦,而且它们不支持可选参数也给编程带来了极大的不便,在操作一些程序的对象时,那些动辄10多个参数的方法,绝对能让C#的开发者一边传参数一边看着VB开发者的悠闲自得大叫吐血。然而在Ruby里,这一切都不重要了。
动态的标识符,弱数据类型,没有public,没有void,没有function/sub/property,你只需要字母表的第4-6个字母(def),管它是函数还是方法还是属性,全都能搞定。至于attr_accessor这样的东西,也就是默认属性,最多只能算是语法糖而已。
匈牙利命名法作为一种代码书写风格,在别的语言中最多是作为一种约定存在,在Ruby中却成了铁律,你必须用$来开头一个全局变量,用@来开头属性,用大写字母来开头常量和类名,用小写字母来开头变量。这不是建议,而是强制,但这种强制从来不会让人觉得不适,它并不会束缚你的思想,相反,它像一个好管家一样,把Ruby的一切都给你管理得井井有条。Intellisense?已经不重要了,这个是只有被C#、VB还有Delphi惯坏了的人才用得到的东西,区区39个关键字还记不得吗?初中课本任何一个单元的生词都不止这么多吧。
所以Ruby不需要IDE,UltraEdit32到现在为止似乎也没有官方的Ruby语法加亮器(相反,它对MS的新生事物C#和VB.net迎合的很快)。你甚至连UltraEdit32也不需要了,记事本就能成为一个很好的Ruby开发工具。
四. 以柔克刚的“弱”类型
我一向认为,若编程语言也有性别,以Ruby这种行云流水的风格,该是一可爱而充满自信的女孩。况且“Ruby”在人名表中也是女子名么。而像C++那种通篇充满着各种符号的语言,该是非常男子化的象征了,int i=8; 这种“拿毛巾,擦汗”的命令式口吻,与VB里dim i as integer=8那种“我要擦汗,快给我条毛巾”这种小女生婆婆妈妈的冗长,我都不喜欢。然而Ruby不同,她会很简洁的说i=8“来条毛巾吧”,可爱的让你不忍心问她要毛巾做什么。但如果她遇到了麻烦的,棘手的,自己一时处理不了的事情,她会慢慢的给你一步步娓娓道来,就像讲故事一样(例1):
i=(case self.element_rate[x]
when 1
-100
when 2
0
when 3
50
when 4
200
when 5
300
else
100
end)
她的表达能力和接受能力是如此之强,以至于你完全可以这么做(例2):
i=(case self.element_rate[x]
when 1
-100
when 2
nil
when 3
false
when 4
“ruby”
when 5
{17=>[0], true=>”my god”}
else
[7,22,34]
end)
这就是Ruby的“弱”类型特征,由于没有类型识别,你可以随便把自己想要的某个类型值赋给一个变量。但是Ruby的内心是倔强的,当你给一个变量赋了值以后,你不能再让它做一些做不了的事情。以下做法在Ruby里是行不通的:
i=8
i=””+i
这正是Ruby的聪明之处,它可以很快的检测出你对变量做了什么不该做的事情,然而JavaScript这方面却是糊涂到家,上面的代码不但可以通过,而且更被很多人拿来当一种将数字转化为字符串的偷懒做法。VBScript也是这样。所谓的弱类型Implicit转换,表面上看是语法糖,实际上却是糖衣炮弹。相比之下,Ruby的弱类型特征,是真正省略了程序员定义类型的麻烦,体现动态语言优越性的地方。你可能不知道一个变量的类型,但是你可以在运行时用is_a?方法来很容易的检测出一个变量实际具有的类型,相比.NET Framework里让人看的一个头两个大的委托和反射语法——仿佛带着脚镣跳舞——Ruby弱类型与动态特性的完美结合,才是真正的翩翩起舞,才真正能让人达到武学中所说那种“心剑合一”的境界。
五. 结语
Ruby的特性还有很多,关于这点,有名为“我喜欢Ruby的37个理由”的网文为证(http://hypermetrics.com/ruby.html)。鉴于篇幅,不能在此逐一介绍。然而Ruby并不是“阳春白雪”式的大家闺秀,更绝非“博大精深”的老学究。Ruby更像是一个平易近人的邻家女孩,她用简约的语言表达着丰富的内涵,谈吐中彰显着优雅却不贵族化的气质,举手中流露出干练而不失细心的性格。就像Ruby的官方网站所说的那样,Ruby——A Programmer’s Best Friend.
|
|