Ruby
![](/icons/71301dou.gif)
![](/icons/71301yi.gif)
种为简单快捷面向对象
![](/icons/71301chengxu.gif)
设计而创
![](/icons/71301de.gif)
脚本语言
![](/icons/71301dou.gif)
由日本人Yukihiro Matsumoto(外号matz)开发
![](/icons/71301dou.gif)
遵守GPL协议和Ruby License
![](/icons/71301dou2.gif)
Ruby
![](/icons/71301de.gif)
作者认为“Ruby > Smalltalk + Perl”
![](/icons/71301dou.gif)
表示Ruby是
![](/icons/71301yi.gif)
个语法像Smalltalk
![](/icons/71301yi.gif)
样完全面向对象、脚本执行、又有Perl强大
![](/icons/71301de.gif)
文字处理功能
![](/icons/71301de.gif)
![](/icons/71301chengxu.gif)
语言
![](/icons/71301dou2.gif)
1、Ruby 是面向对象语言
![](/icons/71301dou2.gif)
这意味着什么呢?
![](/icons/71301de.gif)
确
![](/icons/71301dou.gif)
有关“什么是 OOP”
![](/icons/71301dou.gif)
每十位
![](/icons/71301chengxu.gif)
员当中恐怕就有十 2种看法
![](/icons/71301dou2.gif)
这个问题我留待您自己判断
![](/icons/71301dou2.gif)
而就特征而言
![](/icons/71301dou.gif)
Ruby 提供了机制
![](/icons/71301dou.gif)
将数据和思路方法封装到对象里
![](/icons/71301dou.gif)
实现了
![](/icons/71301yi.gif)
个类到另
![](/icons/71301yi.gif)
个类
![](/icons/71301de.gif)
继承机制
![](/icons/71301dou.gif)
还提供对象多态机制
![](/icons/71301dou2.gif)
和某些语言(C
![](/icons/71301jiajia.gif)
、Perl 5 等等)区别
![](/icons/71301de.gif)
是
![](/icons/71301dou.gif)
Ruby 从
![](/icons/71301yi.gif)
开始
![](/icons/71301de.gif)
时候就是以面向对象为目标来设计
![](/icons/71301de.gif)
![](/icons/71301dou2.gif)
2、Ruby 是“纯正”
![](/icons/71301de.gif)
OOP 语言
![](/icons/71301dou2.gif)
我说重复了么?我可不这么认为
![](/icons/71301dou2.gif)
说“纯正”
![](/icons/71301dou.gif)
这就意味着
![](/icons/71301dou.gif)
所有
![](/icons/71301de.gif)
![](/icons/71301yi.gif)
切——包括
![](/icons/71301zifu.gif)
串或整型的类
![](/icons/71301de.gif)
基本数据类型——都是以对象
![](/icons/71301de.gif)
形态来表达
![](/icons/71301de.gif)
![](/icons/71301dou2.gif)
在 Ruby 中用不着 Java 里面提供
![](/icons/71301de.gif)
那种 wrapper
![](/icons/71301class.gif)
(包裹类)(译注:wrapper
![](/icons/71301class.gif)
用来将基本类型包装成对象类型)
![](/icons/71301dou2.gif)
而且
![](/icons/71301dou.gif)
甚至连常量都被当作对象来对待
![](/icons/71301dou.gif)
因此思路方法可以由——比如数字常量——来唤起
![](/icons/71301dou2.gif)
3、Ruby 是动态语言
![](/icons/71301dou2.gif)
对于只熟悉诸如 C
![](/icons/71301jiajia.gif)
、Java 等静态语言
![](/icons/71301de.gif)
人而言
![](/icons/71301dou.gif)
这就是个新概念
![](/icons/71301dou2.gif)
所谓动态意味着
![](/icons/71301dou.gif)
可以在运行期动态地追加或者重新定义思路方法和变量
![](/icons/71301dou2.gif)
这种动态机制免除了对 C 语言中条件编译(#
![](/icons/71301if.gif)
def)这类功能
![](/icons/71301de.gif)
需要
![](/icons/71301dou.gif)
并且使构建复杂
![](/icons/71301de.gif)
reflection(内省机制)API 成为可能
![](/icons/71301dou2.gif)
复杂
![](/icons/71301de.gif)
reflection 机制又进而使得
![](/icons/71301chengxu.gif)
可以变得更为“自知(self-aware)”——从而为如下诸多功能开启了方便的门:运行期类型信息、丢失思路方法
![](/icons/71301de.gif)
侦测、能够侦测新追加
![](/icons/71301de.gif)
思路方法
![](/icons/71301de.gif)
钩子技术
![](/icons/71301dou.gif)
等等
![](/icons/71301dou2.gif)
从这个方面来看
![](/icons/71301dou.gif)
Ruby 和 Lisp 和 Smalltalk 有些许亲缘关系
![](/icons/71301dou2.gif)
4、Ruby 是解释型语言
![](/icons/71301dou2.gif)
这是个复杂问题
![](/icons/71301dou.gif)
值得多说几句
![](/icons/71301dou2.gif)
有人可以争论说
![](/icons/71301dou.gif)
从性能方面来考量
![](/icons/71301dou.gif)
语言采用解释型机制弊大于利
![](/icons/71301dou2.gif)
对于这种想法
![](/icons/71301dou.gif)
我用下面
![](/icons/71301de.gif)
斟酌予以回应:1. 首先最为显著
![](/icons/71301de.gif)
是
![](/icons/71301dou.gif)
快速开发周期(rapid development cycle)颇有效益可得
![](/icons/71301dou.gif)
Ruby
![](/icons/71301de.gif)
解释型语言本质助长这种效益
![](/icons/71301dou2.gif)
2. 太慢到底是多慢呢?说慢的前请先做
![](/icons/71301yi.gif)
些性能测试
![](/icons/71301dou2.gif)
3. 尽管会有人因此而批评我
![](/icons/71301dou.gif)
但我还是要这么说:处理器每年都在持续提速
![](/icons/71301dou2.gif)
4. 如果您着实需要速度
![](/icons/71301dou.gif)
您可以用 C 语言撰写需要速度
![](/icons/71301de.gif)
那部分代码
![](/icons/71301dou2.gif)
5. 最后
![](/icons/71301dou.gif)
从某种意义上说
![](/icons/71301dou.gif)
有
![](/icons/71301yi.gif)
种值得商榷
![](/icons/71301de.gif)
观点:鉴于没有哪种语言是从骨子里就被解释
![](/icons/71301dou.gif)
因此并不能说不可能撰写出 Ruby 编译器
![](/icons/71301dou2.gif)
5、Ruby 能够处理正则表达式
![](/icons/71301dou2.gif)
多年以来
![](/icons/71301dou.gif)
正则表达式
![](/icons/71301yi.gif)
直被认为是属于 UNIX 领域
![](/icons/71301de.gif)
雕虫小技
![](/icons/71301dou.gif)
涉及诸如 grep 和 sed 的类
![](/icons/71301de.gif)
阳春工具
![](/icons/71301dou.gif)
或是在 vi 里面做
![](/icons/71301yi.gif)
些讨巧
![](/icons/71301de.gif)
“查找-替换”操作
![](/icons/71301dou2.gif)
Perl 语言帮助人们改变了这种看法
![](/icons/71301dou.gif)
而现在 Ruby 也对此有所帮助
![](/icons/71301dou2.gif)
越来越多
![](/icons/71301de.gif)
人认识到这种超高级
![](/icons/71301de.gif)
![](/icons/71301zifu.gif)
串和文本操纵窍门技巧中所蕴含
![](/icons/71301de.gif)
无比威力
![](/icons/71301dou2.gif)
对此持怀疑态度者
![](/icons/71301dou.gif)
应该去读
![](/icons/71301yi.gif)
读 Jeffrey Friedl
![](/icons/71301de.gif)
书 Mastering Regular Expressions
![](/icons/71301dou2.gif)
非怀疑论者也应该读
![](/icons/71301dou2.gif)
6、Ruby 是支持多种平台
![](/icons/71301de.gif)
语言
![](/icons/71301dou2.gif)
Ruby 可以运行在 Linux 及其他 UNIX 变体、各种版本 Windows 平台、BeOS
![](/icons/71301dou.gif)
甚至 MS-DOS 上
![](/icons/71301dou2.gif)
如果我没记错
![](/icons/71301de.gif)
话
![](/icons/71301dou.gif)
还有 Amiga 版本
![](/icons/71301de.gif)
![](/icons/71301dou2.gif)
7、Ruby 借鉴了前辈语言
![](/icons/71301dou2.gif)
这是好事儿吗?在文学领域的外
![](/icons/71301dou.gif)
是
![](/icons/71301de.gif)
![](/icons/71301dou.gif)
这是好事儿
![](/icons/71301dou2.gif)
牛顿说
![](/icons/71301dou.gif)
“若我看得比别人远
![](/icons/71301dou.gif)
乃是
![](/icons/71301yinwei.gif)
我站在了巨人
![](/icons/71301de.gif)
肩上”
![](/icons/71301dou2.gif)
Ruby 确实是站在了巨人
![](/icons/71301de.gif)
肩上
![](/icons/71301dou2.gif)
Ruby 引借了来自 Smalltalk, CLU, Lisp, C, C
![](/icons/71301jiajia.gif)
, Perl, Kornshell
![](/icons/71301dou.gif)
以及其他语言
![](/icons/71301de.gif)
特性
![](/icons/71301dou2.gif)
我看到其中
![](/icons/71301de.gif)
原则是:1. 不要重新发明轮子;2. 不要修补没有问题
![](/icons/71301de.gif)
部分;3. 特别重要
![](/icons/71301de.gif)
是
![](/icons/71301dou.gif)
充分利用人们现有
![](/icons/71301de.gif)
知识
![](/icons/71301dou2.gif)
您掌握 UNIX 里面
![](/icons/71301de.gif)
文件和管道(pipes)吗?没问题
![](/icons/71301dou.gif)
您可以在 Ruby 中运用到那些知识
![](/icons/71301dou2.gif)
您花了两年时间研习 pr
![](/icons/71301int.gif)
f
![](/icons/71301de.gif)
各种格式符号?别担心
![](/icons/71301dou.gif)
您在 Ruby 里面还可以使用 pr
![](/icons/71301int.gif)
f
![](/icons/71301dou2.gif)
您了解 Perl
![](/icons/71301de.gif)
regex handling 技术?好
![](/icons/71301de.gif)
![](/icons/71301dou.gif)
那么您几乎也就立刻学会了 Ruby
![](/icons/71301de.gif)
regex handling 技术
![](/icons/71301dou2.gif)
8、Ruby 具创新性
![](/icons/71301dou2.gif)
这
![](/icons/71301yi.gif)
条和第7条有些矛盾吧?唔……是有
![](/icons/71301yi.gif)
点;每个硬币都有两面嘛
![](/icons/71301dou2.gif)
Ruby 有
![](/icons/71301yi.gif)
些特征极具创新性
![](/icons/71301dou.gif)
比如非常有用
![](/icons/71301de.gif)
mix-in 概念
![](/icons/71301dou2.gif)
或许这些创新型特征将来会被新
![](/icons/71301de.gif)
语言借鉴
![](/icons/71301dou2.gif)
(注:
![](/icons/71301yi.gif)
位读者向我指出
![](/icons/71301dou.gif)
LISP 至少早在 1979 年就有 mix-in 了
![](/icons/71301dou2.gif)
这
![](/icons/71301yi.gif)
点我倒是完全没有注意到;我当另寻
![](/icons/71301yi.gif)
个更好
![](/icons/71301de.gif)
例证
![](/icons/71301dou.gif)
保证其真确性
![](/icons/71301dou2.gif)
)
9、Ruby 是特高级语言(Very High-Level Language
![](/icons/71301dou.gif)
VHLL)
![](/icons/71301dou2.gif)
这个问题有待商榷
![](/icons/71301dou.gif)
![](/icons/71301yinwei.gif)
术语 VHLL 还未被广泛使用
![](/icons/71301dou.gif)
而其含义更是比 OOP
![](/icons/71301de.gif)
含义更具争议性
![](/icons/71301dou2.gif)
我说“特高级”指
![](/icons/71301de.gif)
是
![](/icons/71301dou.gif)
Ruby 可以通过相对较少
![](/icons/71301de.gif)
指令掌控复杂
![](/icons/71301de.gif)
数据结构并对其进行复杂
![](/icons/71301de.gif)
操作
![](/icons/71301dou.gif)
符合了被
![](/icons/71301yi.gif)
些人称为“最少投入”
![](/icons/71301de.gif)
原则(Principle of Least Effort)
![](/icons/71301dou2.gif)
10、Ruby 有智能垃圾收集器
![](/icons/71301dou2.gif)
诸如 malloc 和 free 的类
![](/icons/71301de.gif)
![](/icons/71301hanshu.gif)
现在只是已然过去
![](/icons/71301de.gif)
昨夜噩梦
![](/icons/71301dou2.gif)
您连析构
![](/icons/71301hanshu.gif)
都不需要
![](/icons/71301diaoyong.gif)
![](/icons/71301dou2.gif)
仅此足矣
![](/icons/71301dou2.gif)
11、Ruby 是脚本语言
![](/icons/71301dou2.gif)
不要以为 Ruby 是脚本语言所以就不强大
![](/icons/71301dou2.gif)
Ruby 可不是玩具
![](/icons/71301dou2.gif)
Ruby 是全功能
![](/icons/71301de.gif)
![](/icons/71301chengxu.gif)
设计语言
![](/icons/71301dou.gif)
只不过 Ruby 让传统
![](/icons/71301de.gif)
脚本操作变得更容易撰写
![](/icons/71301dou.gif)
比如运行外部
![](/icons/71301chengxu.gif)
、检查系统资源、使用 pipe(管道)、截获输出等等
![](/icons/71301dou2.gif)
12、Ruby 用处多样
![](/icons/71301dou2.gif)
Ruby 可以完成好 Kornshell 能够完成好
![](/icons/71301de.gif)
事情
![](/icons/71301dou.gif)
也可以完成好 C 语言能够完成好
![](/icons/71301de.gif)
事情
![](/icons/71301dou2.gif)
想快速写
![](/icons/71301yi.gif)
个十行
![](/icons/71301de.gif)
hack
![](/icons/71301chengxu.gif)
来完成
![](/icons/71301yi.gif)
次性
![](/icons/71301de.gif)
任务
![](/icons/71301dou.gif)
或者为遗留代码写个 wrapper 吗?用 Ruby 没问题
![](/icons/71301dou2.gif)
想写
![](/icons/71301yi.gif)
个 Web 服务器、CGI
![](/icons/71301dou.gif)
或者棋类游戏吗?用 Ruby 也没问题
![](/icons/71301dou2.gif)
13、Ruby 对线程予以支持
![](/icons/71301dou2.gif)
您可以使用简单
![](/icons/71301de.gif)
API 撰写多线程应用
![](/icons/71301chengxu.gif)
![](/icons/71301dou2.gif)
是
![](/icons/71301de.gif)
![](/icons/71301dou.gif)
即使是在 MS-DOS 上撰写也可以
![](/icons/71301dou2.gif)
14、Ruby 是开源
![](/icons/71301de.gif)
![](/icons/71301dou2.gif)
想看 Ruby
![](/icons/71301de.gif)
源代码了?想提供
![](/icons/71301yi.gif)
个补丁建议了?只管去吧!想和智慧云集、乐于助人、包括语言设计者在内
![](/icons/71301de.gif)
用户社区进行联络吗?可以
![](/icons/71301de.gif)
!
15、Ruby 具有直观性(直觉性)
![](/icons/71301dou2.gif)
学习曲线平滑不陡
![](/icons/71301dou2.gif)
![](/icons/71301yi.gif)
旦入了门
![](/icons/71301dou.gif)
您是否就开始“猜测” Ruby
![](/icons/71301de.gif)
使用方式了呢?您
![](/icons/71301de.gif)
猜测通常是正确
![](/icons/71301de.gif)
(译注:
![](/icons/71301yinwei.gif)
Ruby 很直观
![](/icons/71301dou.gif)
符合了人们惯常期待
![](/icons/71301de.gif)
方式)
![](/icons/71301dou2.gif)
Ruby 致力于符合“最少诧异或惊讶”的原则(Principle of Least Astonishment (or Surprise)).
16、Ruby 具有异常(exception)机制
![](/icons/71301dou2.gif)
同 Java 和 C
![](/icons/71301yi.gif)
样
![](/icons/71301dou.gif)
Ruby 能处理异常
![](/icons/71301dou2.gif)
这意味着少和返回代码纠缠
![](/icons/71301dou.gif)
更少
![](/icons/71301de.gif)
嵌套
![](/icons/71301if.gif)
语句
![](/icons/71301dou.gif)
更少
![](/icons/71301de.gif)
意大利面式逻辑(spaghetti logic
![](/icons/71301dou.gif)
贬义
![](/icons/71301dou.gif)
指
![](/icons/71301de.gif)
是复杂混乱
![](/icons/71301de.gif)
代码设计
![](/icons/71301dou.gif)
比如大量使用GOTO语句等等)
![](/icons/71301dou.gif)
更好
![](/icons/71301de.gif)
![](/icons/71301cuowu.gif)
处理机能
![](/icons/71301dou2.gif)
17、Ruby 有高级
![](/icons/71301de.gif)
Array
![](/icons/71301shuzu.gif)
是动态
![](/icons/71301de.gif)
;您不必像在 Pascal 等语言当中那样在编译期声明
![](/icons/71301shuzu.gif)
大小
![](/icons/71301dou2.gif)
您不必像在 C/C
![](/icons/71301jiajia.gif)
/Java 当中那样为
![](/icons/71301shuzu.gif)
分配内存空间
![](/icons/71301dou2.gif)
Ruby
![](/icons/71301de.gif)
![](/icons/71301shuzu.gif)
是对象
![](/icons/71301dou.gif)
因此您不必时刻警惕其长度;原则上
![](/icons/71301dou.gif)
您不可能像在 C 语言当中那样“越出
![](/icons/71301shuzu.gif)
![](/icons/71301de.gif)
长度大限”
![](/icons/71301dou2.gif)
想以索引、元素
![](/icons/71301dou.gif)
或者反向处理
![](/icons/71301shuzu.gif)
吗?想打印整个
![](/icons/71301shuzu.gif)
吗?Ruby 为所有这些事情提供了对应
![](/icons/71301de.gif)
思路方法
![](/icons/71301dou2.gif)
想把
![](/icons/71301shuzu.gif)
当作集合(
![](/icons/71301set.gif)
)、堆栈(stack)
![](/icons/71301dou.gif)
或队列(queue)来对待吗?Ruby 也为此提供了对应
![](/icons/71301de.gif)
思路方法
![](/icons/71301dou2.gif)
想把
![](/icons/71301shuzu.gif)
当作查找表(lookup table)来使用吗?这是个问题问得巧——您不必这样用
![](/icons/71301dou.gif)
![](/icons/71301yinwei.gif)
Ruby 提供了哈希表专门处理这个问题
![](/icons/71301dou2.gif)
18、Ruby 是可扩展
![](/icons/71301de.gif)
![](/icons/71301dou2.gif)
您可以用 Ruby 或者 C 语言编写外部
![](/icons/71301chengxu.gif)
库
![](/icons/71301dou2.gif)
另外
![](/icons/71301dou.gif)
您还可以随心所欲地就地修改现存
![](/icons/71301de.gif)
类和对象
![](/icons/71301dou2.gif)
19、Ruby 鼓励 literate programming(字面编程方式)
![](/icons/71301dou2.gif)
您可以将注释嵌入到代码中
![](/icons/71301dou.gif)
Ruby
![](/icons/71301de.gif)
文档工具可以从中抽取和操纵这些注释
![](/icons/71301dou2.gif)
(Literate programming
![](/icons/71301de.gif)
铁杆儿支持者或许会认为这是很基础
![](/icons/71301de.gif)
东西吧
![](/icons/71301dou2.gif)
)
20、Ruby 以创新
![](/icons/71301de.gif)
方式使用分隔符和大小写
![](/icons/71301dou2.gif)
返回 Boolean(尽管 Ruby 不这样称呼它)
![](/icons/71301de.gif)
思路方法通常都以问号结尾
![](/icons/71301dou.gif)
而且
![](/icons/71301dou.gif)
修改数据
![](/icons/71301de.gif)
思路方法
![](/icons/71301de.gif)
名称带有惊叹号
![](/icons/71301dou2.gif)
![](/icons/71301yi.gif)
切都简单、明了、直观
![](/icons/71301dou2.gif)
包括
![](/icons/71301class.gif)
名称在内
![](/icons/71301de.gif)
所有常量都以大写字母开头
![](/icons/71301dou2.gif)
所有对象
![](/icons/71301de.gif)
attributes 都以 @ 标记开头
![](/icons/71301dou2.gif)
这种方案既有老式
![](/icons/71301de.gif)
“匈牙利表示法(Hungarian notation)”
![](/icons/71301de.gif)
务实性
![](/icons/71301dou.gif)
又避免了龌龊刺眼
![](/icons/71301de.gif)
表现形式
![](/icons/71301dou2.gif)
21、Ruby
![](/icons/71301de.gif)
保留字不保留
![](/icons/71301dou2.gif)
使用被称为“保留字(reserved word)”
![](/icons/71301de.gif)
标识符是完全没有问题
![](/icons/71301de.gif)
![](/icons/71301dou.gif)
只要保证别让语法分析器遇到歧义
![](/icons/71301de.gif)
情况就行
![](/icons/71301dou2.gif)
这可真是畅快
![](/icons/71301dou2.gif)
22、Ruby 支持迭代器(iterator)
![](/icons/71301dou2.gif)
Ruby
![](/icons/71301de.gif)
迭代器使得“传递代码区块到对象中”这种操作可以经由这样
![](/icons/71301de.gif)
方式来完成
![](/icons/71301dou.gif)
即对于
![](/icons/71301shuzu.gif)
、列表(list)、树(tree)等诸多结构中
![](/icons/71301de.gif)
每
![](/icons/71301yi.gif)
个元素都能够
![](/icons/71301diaoyong.gif)
指定
![](/icons/71301de.gif)
代码区块
![](/icons/71301dou2.gif)
这是个值得深入探究
![](/icons/71301dou.gif)
威力强大
![](/icons/71301de.gif)
窍门技巧
![](/icons/71301dou2.gif)
23、Ruby 具有安全性特性
![](/icons/71301dou2.gif)
Ruby 借用了 Perl
![](/icons/71301de.gif)
“点缀(ta
![](/icons/71301int.gif)
ing)”概念
![](/icons/71301dou.gif)
通过 $SAFE 变量实现了多种控制级别(揪心级别?)
![](/icons/71301dou2.gif)
此特性对于“为了攻破 web 服务器而被利用”
![](/icons/71301de.gif)
CGI
![](/icons/71301chengxu.gif)
而言
![](/icons/71301dou.gif)
特别有好处
![](/icons/71301dou2.gif)
24、Ruby 没有指针
![](/icons/71301dou2.gif)
类似 Java
![](/icons/71301dou.gif)
并向 C
![](/icons/71301jiajia.gif)
恶狠狠地点了点头
![](/icons/71301dou.gif)
Ruby 中没有“指针(po
![](/icons/71301int.gif)
er)”概念;不存在间接性
![](/icons/71301dou.gif)
没有指针运算
![](/icons/71301dou.gif)
没有语法和调试指针所带来
![](/icons/71301de.gif)
头疼困扰
![](/icons/71301dou2.gif)
当然
![](/icons/71301dou.gif)
这意味着真正底层
![](/icons/71301de.gif)
系统编程变得困难了
![](/icons/71301yi.gif)
些
![](/icons/71301dou.gif)
比如访问某设备
![](/icons/71301de.gif)
控制状态寄存器;但这些系统级事务总是可以利用 C
![](/icons/71301chengxu.gif)
库来完成
![](/icons/71301dou2.gif)
(正如 C
![](/icons/71301chengxu.gif)
员会在必要时使用汇编
![](/icons/71301yi.gif)
样
![](/icons/71301dou.gif)
Ruby
![](/icons/71301chengxu.gif)
员会在必要时使用 C 语言!)
25、Ruby 关注细节
![](/icons/71301dou2.gif)
Ruby 提供丰富
![](/icons/71301de.gif)
同义词和别名
![](/icons/71301dou2.gif)
不记得对
![](/icons/71301shuzu.gif)
或
![](/icons/71301zifu.gif)
串是用 size 还是 length 吗?两个都可以用
![](/icons/71301dou2.gif)
对于范围(range)
![](/icons/71301dou.gif)
是用 begin 和 end
![](/icons/71301dou.gif)
还是 first 和 last?由您自选
![](/icons/71301dou2.gif)
您心里拼写 indices
![](/icons/71301dou.gif)
而您
![](/icons/71301de.gif)
手却拼出 indexes 吗?两个都可以用
![](/icons/71301dou2.gif)
26、Ruby 具有灵活
![](/icons/71301de.gif)
语法特性
![](/icons/71301dou2.gif)
在思路方法
![](/icons/71301diaoyong.gif)
中可以忽略括号
![](/icons/71301dou.gif)
参数的间可以忽略逗号
![](/icons/71301dou2.gif)
Perl 风格
![](/icons/71301de.gif)
引号允许我们定义
![](/icons/71301shuzu.gif)
或
![](/icons/71301zifu.gif)
串时不必劳烦去敲那些引号和逗号(译注:Ruby 中 a = [ 'ant', 'bee', 'cat' ] 可以简写为 a = %w{ ant bee cat })
![](/icons/71301dou2.gif)
![](/icons/71301return.gif)
关键字也可以忽略
![](/icons/71301dou2.gif)
27、Ruby 有丰富
![](/icons/71301de.gif)
![](/icons/71301chengxu.gif)
库可供使用
![](/icons/71301dou2.gif)
Ruby
![](/icons/71301de.gif)
![](/icons/71301chengxu.gif)
库提供了对线程、套接字(
![](/icons/71301socket.gif)
)、有限
![](/icons/71301de.gif)
对象永续机制、CGI、服务器端可执行机制、DB 文件等许多功能
![](/icons/71301de.gif)
支持
![](/icons/71301dou2.gif)
Ruby 还对 Tk 有所支持
![](/icons/71301dou.gif)
今后会有更多
![](/icons/71301de.gif)
支持
![](/icons/71301dou2.gif)
28、Ruby 有调试器(debugger)
![](/icons/71301dou2.gif)
在完美世界里我们大约不需要调试器
![](/icons/71301dou2.gif)
可惜这并不是完美
![](/icons/71301de.gif)
世界
![](/icons/71301dou2.gif)
29、Ruby 可通过交互
![](/icons/71301de.gif)
方式来使用
![](/icons/71301dou2.gif)
Ruby 设计为可以将其当作
![](/icons/71301yi.gif)
种类似 Kornshell
![](/icons/71301de.gif)
shell 来使用
![](/icons/71301dou2.gif)
(这是本文中最令人质疑
![](/icons/71301de.gif)
观点
![](/icons/71301dou.gif)
而且我也不得不承认
![](/icons/71301dou.gif)
Ruby 并不是真正非常优秀
![](/icons/71301de.gif)
shell
![](/icons/71301dou2.gif)
但我还是坚持认为
![](/icons/71301dou.gif)
基于 Ruby
![](/icons/71301de.gif)
shell 是个不错
![](/icons/71301de.gif)
东西
![](/icons/71301dou2.gif)
)
30、Ruby 是精炼
![](/icons/71301de.gif)
语言
![](/icons/71301dou2.gif)
Ruby 中没有非必要
![](/icons/71301de.gif)
关键字
![](/icons/71301dou.gif)
比如 Pascal
![](/icons/71301de.gif)
begin
![](/icons/71301dou.gif)
![](/icons/71301if.gif)
的后
![](/icons/71301de.gif)
then
![](/icons/71301dou.gif)
while 的后
![](/icons/71301de.gif)
do
![](/icons/71301dou2.gif)
不需要事先声明变量
![](/icons/71301dou.gif)
![](/icons/71301yinwei.gif)
变量无类型
![](/icons/71301dou2.gif)
不需要为思路方法指定返回类型
![](/icons/71301dou2.gif)
不需要
![](/icons/71301return.gif)
关键字;思路方法会返回最后被求值
![](/icons/71301de.gif)
表达式的结果
![](/icons/71301dou2.gif)
另外
![](/icons/71301yi.gif)
方面……Ruby 不像 C 或 Perl 那么晦涩
![](/icons/71301dou2.gif)
31、Ruby 是面向表达
![](/icons/71301de.gif)
语言(expression-oriented)
![](/icons/71301dou2.gif)
您可以像说话
![](/icons/71301yi.gif)
样很容易写出 x =
![](/icons/71301if.gif)
a<0 b c end
![](/icons/71301else.gif)
then> 这样
![](/icons/71301de.gif)
句子
![](/icons/71301dou2.gif)
32、Ruby 语言中系结了 syntax sugar(语法糖)
![](/icons/71301dou2.gif)
(转述 Mary Poppins
![](/icons/71301de.gif)
话说就是:
![](/icons/71301yi.gif)
勺语法糖可以压
![](/icons/71301yi.gif)
压语义
![](/icons/71301de.gif)
药味
![](/icons/71301dou2.gif)
"A spoonful of syntax sugar helps the semantic medicine go down.")只要您想
![](/icons/71301dou.gif)
您就可以用 for a in x 来迭代遍历
![](/icons/71301shuzu.gif)
x
![](/icons/71301dou.gif)
可以用 a
![](/icons/71301jiadeng.gif)
b 来代替 a = a + b
![](/icons/71301dou2.gif)
大多数操作符其实只是简化
![](/icons/71301de.gif)
思路方法表示、更加直觉
![](/icons/71301de.gif)
名称以及更加方便使用
![](/icons/71301de.gif)
语法形式
![](/icons/71301dou2.gif)
译注:Mary Poppins 指
![](/icons/71301de.gif)
是美国1964年拍摄
![](/icons/71301de.gif)
经典电影
![](/icons/71301smhl.gif)
欢乐满人间(Mary Poppins)
![](/icons/71301smhr.gif)
![](/icons/71301dou2.gif)
33、Ruby 支持操作符重载(overloading)
![](/icons/71301dou2.gif)
如果我没记错
![](/icons/71301de.gif)
话
![](/icons/71301dou.gif)
操作符重载源起自很久以前
![](/icons/71301de.gif)
SNOBOL
![](/icons/71301dou.gif)
但却是由较近
![](/icons/71301de.gif)
C
![](/icons/71301jiajia.gif)
振兴
![](/icons/71301dou2.gif)
这个机制可能会被滥用或误用
![](/icons/71301dou.gif)
但有总比没有好
![](/icons/71301dou2.gif)
另外
![](/icons/71301dou.gif)
Ruby 会自动定义操作符
![](/icons/71301de.gif)
赋值(assignment)版本
![](/icons/71301dou.gif)
比如说
![](/icons/71301dou.gif)
您定义了操作符 +
![](/icons/71301dou.gif)
那么您就会自动得到操作符
![](/icons/71301jiadeng.gif)
![](/icons/71301dou2.gif)
34、Ruby 具有无限精度
![](/icons/71301de.gif)
整数算法
![](/icons/71301dou2.gif)
谁还关心
![](/icons/71301short.gif)
、
![](/icons/71301int.gif)
、long 呢? 使用 Bignum 就行了
![](/icons/71301dou2.gif)
承认吧
![](/icons/71301dou.gif)
您总还是想看看365
![](/icons/71301de.gif)
阶乘是多少
![](/icons/71301dou2.gif)
现在您可以看了
![](/icons/71301dou2.gif)
35、Ruby 具有幂运算操作符
![](/icons/71301dou2.gif)
在过去年代
![](/icons/71301dou.gif)
我们在 BASIC 和 FORTRAN 里使用过幂运算操作符
![](/icons/71301dou2.gif)
但是后来我们学会了 Pascal 和 C 语言
![](/icons/71301dou.gif)
知道了这个操作符邪恶
![](/icons/71301de.gif)
![](/icons/71301yi.gif)
面
![](/icons/71301dou2.gif)
(我们被告知
![](/icons/71301dou.gif)
我们甚至都不曾知道求值是如何完成
![](/icons/71301de.gif)
——是使用了对数还是迭代?效率有多高?)可是我们真
![](/icons/71301de.gif)
关心这些么?如果是
![](/icons/71301dou.gif)
我们可以编写自己
![](/icons/71301de.gif)
版本
![](/icons/71301dou2.gif)
如果不是
![](/icons/71301dou.gif)
Ruby 还提供了您珍爱
![](/icons/71301de.gif)
老好用
![](/icons/71301de.gif)
** operator 供您使用
![](/icons/71301dou2.gif)
享用它吧!
36、Ruby 具有强大
![](/icons/71301de.gif)
![](/icons/71301zifu.gif)
串处理能力
![](/icons/71301dou2.gif)
如果您想对
![](/icons/71301zifu.gif)
串进行搜索、替换、修改、格式化、截断(trim)、分隔(delimit)、追加(
![](/icons/71301int.gif)
erpose)
![](/icons/71301dou.gif)
或者字元化(tokenize)等操作
![](/icons/71301dou.gif)
您可以使用 Ruby 内建
![](/icons/71301de.gif)
思路方法
![](/icons/71301dou2.gif)
如过内建思路方法不能满足要求
![](/icons/71301dou.gif)
您可以利用内建思路方法来建构自己所需
![](/icons/71301dou2.gif)
37、Ruby 几乎没有违反自身规则
![](/icons/71301de.gif)
例外情况
![](/icons/71301dou2.gif)
Ruby
![](/icons/71301de.gif)
语法和语义比大多数语言更具自我完备性(self-consistent)
![](/icons/71301dou2.gif)
每种语言都有犄角旮旯
![](/icons/71301dou.gif)
每种规则都有例外情况;但 Ruby
![](/icons/71301de.gif)
旮旯和例外可能比您想象
![](/icons/71301de.gif)
要少
延伸阅读
最新评论