参考(翻译、摘抄)于Can Ruby Live without Rails?。这篇文章发表于2006年,受访者在回答“如果可以你会把Ruby的哪些特性加入Java“这个问题时,提到了Ruby的一些我个人认为比较突出的语法特性。其实并不是针对Java语言,何况6年时间过去,以Java语法特性的加入速度怕早就有Ruby这些特性了。我对Java不熟,仅限于曾经写的几个简单的android应用,买了<Java编程思想>也没翻完。
以下内容半翻译自原文。
Closure
闭包支持将代码块作为函数参数传递。这在写很多代码时会比较方便,例如以下代码打印10次字符串:
又例如针对数组的每个元素做一些事情(do…end是上例中{}的替代):
也可以构建一个新的数组:
Ruby中闭包的使用随处可见,它的语法形式太简单,这使得要使用它时所付出的代价很小(想想其他语言里得手动构造一个函数对象吧)。
Continuation
使用continuation你可以保存一块代码的执行状态,以便将来某个时刻恢复执行。这就像游戏存档一样,玩到一半存档,一段时间回来后取出存档从上次的进度继续玩。
loop
函数执行里面那个循环时,当i==5
就调用callcc
函数(貌似现在Java已有这个了),该函数在回调传入的闭包时构建了一个continuation对象,以上代码直接将此对象返回,循环暂停于i==5
。执行代码continuation = loop
输出:
然后你可以在任意时刻恢复执行那个循环:continuation.call
,得到:
这个continuation和Lua里的coroutine
很像,可以用于实现轻量级的线程。
mix-ins
这节没看懂。提到了AOP、POJO之类的术语,大概是Java世界里的什么东西。看起来像是针对before/after method的东西,意思就是执行某个函数时,会先去执行before函数,完了后再执行after函数,Lisp里有这个概念。
Open class
这个算是Ruby里用的比较多的特性。open classes可以让你在很多情况下“打开“并重定义某个类,这个类可以是你使用的任意库里的类。Ruby里的类并不是一个封闭的代码集合,作为一个类库的使用者你甚至可以不用修改类库的代码而重新定义、扩展里面的接口。例如Ruby中的数字其实就是Fixnum类,而我们可以为Fixnum直接添加更多的接口(原文的代码有问题,以下我做了修改):
基于以上,我们可以写出10.days.ago
或者6.hours.from_now
这样的代码。这有助于构建DSL(domain specific language)。
Full object orientation
Ruby中一切都是对象。这让我们写代码变得更容易,因为不用处理特殊情况。这些特殊情况主要就是很多基础数据类型并非对象,但Ruby里是。Ruby里每个对象都有一个函数class
,表示该对象的类型:
全文完。