`
eachlive
  • 浏览: 6099 次
  • 性别: Icon_minigender_2
  • 来自: 月亮
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

我爱 Ruby 的三十七个理由 [转]

阅读更多
Thirty-seven Reasons I Love Ruby
我爱 Ruby 的三十七个理由
by Hal Fulton

这里我就不累述 Ruby 语言的历史了。如果您还不了解 Ruby,官方网站 www.ruby-lang.org 是最好的去处,新闻组是 comp.lang.ruby 。而对于已经了解 Ruby 的各位,我在此给出我爱上这门(相对比较)新的语言的理由。如果您还没有访问过 我的Ruby主页 ,不妨去看看。



   1.

      Ruby 是面向对象语言。 这意味着什么呢?的确,关于“什么是 OOP”,每十位程序员当中恐怕就有十二种看法。这个问题我留待您自己判断。而就特征而言,Ruby 提供了机制,将数据和方法封装到对象里,实现了一个类到另一个类的继承机制,还提供对象多态机制。与某些语言(C++、Perl 5 等等)不同的是,Ruby 从一开始的时候就是以面向对象为目标来设计的。
   2.

      Ruby 是“纯正”的 OOP 语言。 我说重复了么?我可不这么认为。说“纯正”,这就意味着,所有的一切——包括字符串或整型之类的基本数据类型——都是以对象的形态来表达的。在 Ruby 中用不着 Java 里面提供的那种 wrapper class(包裹类)(译注:wrapper class 用来将基本类型包装成对象类型)。而且,甚至连常量都被当作对象来对待,因此方法可以由——比如数字常量——来唤起。
   3.

      Ruby 是动态语言。 对于只熟悉诸如 C++、Java 等静态语言的人而言,这就是个新概念。所谓动态意味着,可以在运行期动态地追加或者重新定义方法和变量。这种动态机制免除了对 C 语言中条件编译(#ifdef)这类功能的需要,并且使构建复杂的 reflection(内省机制)API 成为可能。复杂的 reflection 机制又进而使得程序可以变得更为“自知(self-aware)”——从而为如下诸多功能开启了方便之门:运行期类型信息、丢失方法的侦测、能够侦测新追加的方法的钩子技术,等等。从这个方面来看,Ruby 与 Lisp 和 Smalltalk 有些许亲缘关系。
   4.

      Ruby 是解释型语言。 这是个复杂问题,值得多说几句。有人可以争论说,从性能方面来考量,语言采用解释型机制弊大于利。对于这种想法,我用下面的斟酌予以回应:1. 首先最为显著的是,快速开发周期(rapid development cycle)颇有效益可得,Ruby 的解释型语言本质助长这种效益。2. 太慢到底是多慢呢?说慢之前请先做一些性能测试。3. 尽管会有人因此而批评我,但我还是要这么说:处理器每年都在持续提速。4. 如果您着实需要速度,您可以用 C 语言撰写需要速度的那部分代码。5. 最后,从某种意义上说,有一种值得商榷的观点:鉴于没有哪种语言是从骨子里就被解释,因此并不能说不可能撰写出 Ruby 编译器。
   5.

      Ruby 能够处理正则表达式。 多年以来,正则表达式一直被认为是属于 UNIX 领域的雕虫小技,涉及诸如 grep 和 sed 之类的阳春工具,或是在 vi 里面做一些讨巧的“查找-替换”操作。Perl 语言帮助人们改变了这种看法,而现在 Ruby 也对此有所帮助。越来越多的人认识到这种超高级的字符串和文本操纵技巧中所蕴含的无比威力。对此持怀疑态度者,应该去读一读 Jeffrey Friedl 的书 Mastering Regular Expressions 。非怀疑论者也应该读。
   6.

      Ruby 是支持多种平台的语言。 Ruby 可以运行在 Linux 及其他 UNIX 变体、各种版本 Windows 平台、BeOS,甚至 MS-DOS 上。如果我没记错的话,还有 Amiga 版本的。
   7.

      Ruby 借鉴了前辈语言。 这是好事儿吗?在文学领域之外,是的,这是好事儿。牛顿说,“若我看得比别人远,乃是因为我站在了巨人的肩上”。Ruby 确实是站在了巨人的肩上。Ruby 引借了来自 Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell,以及其他语言的特性。我看到其中的原则是:1. 不要重新发明轮子;2. 不要修补没有问题的部分;3. 特别重要的是,充分利用人们现有的知识。您掌握 UNIX 里面的文件和管道(pipes)吗?没问题,您可以在 Ruby 中运用到那些知识。您花了两年时间研习 printf 的各种格式符号?别担心,您在 Ruby 里面还可以使用 printf。您了解 Perl 的 regex handling 技术?好的,那么您几乎也就立刻学会了 Ruby 的 regex handling 技术。
   8.

      Ruby 具创新性。 这一条与第7条有些矛盾吧?唔……是有一点;每个硬币都有两面嘛。Ruby 有一些特征极具创新性,比如非常有用的 mix-in 概念。或许这些创新型特征将来会被新的语言借鉴。(注:一位读者向我指出,LISP 至少早在 1979 年就有 mix-in 了。这一点我倒是完全没有注意到;我当另寻一个更好的例证,保证其真确性。)
   9.

      Ruby 是特高级语言(Very High-Level Language,VHLL)。 这个问题有待商榷,因为术语 VHLL 还未被广泛使用,而其含义更是比 OOP 的含义更具争议性。我说“特高级”指的是,Ruby 可以通过相对较少的指令掌控复杂的数据结构并对其进行复杂的操作,符合了被一些人称为“最少投入”的原则(Principle of Least Effort)。
  10.

      Ruby 有智能垃圾收集器。 诸如 malloc 和 free 之类的函数现在只是已然过去的昨夜噩梦。您连析构函数都不需要调用。仅此足矣。
  11.

      Ruby 是脚本语言。 不要以为 Ruby 是脚本语言所以就不强大。Ruby 可不是玩具。Ruby 是全功能的程序设计语言,只不过 Ruby 让传统的脚本操作变得更容易撰写,比如运行外部程序、检查系统资源、使用 pipe(管道)、截获输出等等。
  12.

      Ruby 用处多样。 Ruby 可以完成好 Kornshell 能够完成好的事情,也可以完成好 C 语言能够完成好的事情。想快速写一个十行的 hack 程序来完成一次性的任务,或者为遗留代码写个 wrapper 吗?用 Ruby 没问题。想写一个 Web 服务器、CGI,或者棋类游戏吗?用 Ruby 也没问题。
  13.

      Ruby 对线程予以支持。 您可以使用简单的 API 撰写多线程应用程序。是的,即使是在 MS-DOS 上撰写也可以。
  14.

      Ruby 是开源的。 想看 Ruby 的源代码了?想提供一个补丁建议了?只管去吧!想与智慧云集、乐于助人、包括语言设计者在内的用户社区进行联络吗?可以的!
  15.

      Ruby 具有直观性(直觉性)。 学习曲线平滑不陡。一旦入了门,您是否就开始“猜测” Ruby 的使用方式了呢?您的猜测通常是正确的(译注:因为 Ruby 很直观,符合了人们惯常期待的方式)。Ruby 致力于符合“最少诧异或惊讶”之原则(Principle of Least Astonishment (or Surprise)).
  16.

      Ruby 具有异常(exception)机制。 同 Java 和 C++ 一样,Ruby 能处理异常。这意味着少与返回代码纠缠,更少的嵌套 if 语句,更少的意大利面式逻辑(spaghetti logic,贬义,指的是复杂混乱的代码设计,比如大量使用GOTO语句等等),更好的错误处理机能。
  17.

      Ruby 有高级的 Array class 。 数组是动态的;您不必像在 Pascal 等语言当中那样在编译期声明数组大小。您不必像在 C/C++/Java 当中那样为数组分配内存空间。Ruby 的数组是对象,因此您不必时刻警惕其长度;原则上,您不可能像在 C 语言当中那样“越出数组的长度大限”。想以索引、元素,或者反向处理数组吗?想打印整个数组吗?Ruby 为所有这些事情提供了对应的方法。想把数组当作集合(set)、堆栈(stack),或队列(queue)来对待吗?Ruby 也为此提供了对应的方法。想把数组当作查找表(lookup table)来使用吗?这是个问题问得巧——您不必这样用,因为 Ruby 提供了哈希表专门处理这个问题。
  18.

      Ruby 是可扩展的。 您可以用 Ruby 或者 C 语言编写外部程序库。另外,您还可以随心所欲地就地修改现存的类和对象。
  19.

      Ruby 鼓励 literate programming(字面编程方式)。 您可以将注释嵌入到代码中,Ruby 的文档工具可以从中抽取和操纵这些注释。(Literate programming 的铁杆儿支持者或许会认为这是很基础的东西吧。)
  20.

      Ruby 以创新的方式使用分隔符和大小写。 返回 Boolean(尽管 Ruby 不这样称呼它)的方法通常都以问号结尾,而且,修改数据的方法的名称带有惊叹号。一切都简单、明了、直观。包括 class 名称在内的所有常量都以大写字母开头。所有对象的 attributes 都以 @ 标记开头。这种方案既有老式的“匈牙利表示法(Hungarian notation)”的务实性,又避免了龌龊刺眼的表现形式。
  21.

      Ruby 的保留字不保留。 使用被称为“保留字(reserved word)”的标识符是完全没有问题的,只要保证别让语法分析器遇到歧义的情况就行。这可真是畅快。
  22.

      Ruby 支持迭代器(iterator)。 Ruby 的迭代器使得“传递代码区块到对象中”这种操作可以经由这样的方式来完成,即对于数组、列表(list)、树(tree)等诸多结构中的每一个元素都能够调用指定的代码区块。这是个值得深入探究,威力强大的技巧。
  23.

      Ruby 具有安全性特性。Ruby 借用了 Perl 的“点缀(tainting)”概念,通过 $SAFE 变量实现了多种控制级别(揪心级别?)。此特性对于“为了攻破 web 服务器而被利用”的 CGI 程序而言,特别有好处。
  24.

      Ruby 没有指针。 类似 Java,并向 C++ 恶狠狠地点了点头,Ruby 中没有“指针(pointer)”概念;不存在间接性,没有指针运算,没有语法和调试指针所带来的头疼困扰。当然,这意味着真正底层的系统编程变得困难了一些,比如访问某设备的控制状态寄存器;但这些系统级事务总是可以利用 C 程序库来完成。(正如 C 程序员会在必要时使用汇编一样,Ruby 程序员会在必要时使用 C 语言!)
  25.

      Ruby 关注细节。 Ruby 提供丰富的同义词和别名。不记得对数组或字符串是用 size 还是 length 吗?两个都可以用。对于范围(range),是用 begin 和 end ,还是 first 和 last?由您自选。您心里拼写 indices ,而您的手却拼出 indexes 吗?两个都可以用。
  26.

      Ruby 具有灵活的语法特性。 在方法调用中可以忽略括号,参数之间可以忽略逗号。Perl 风格的引号允许我们定义数组或字符串时不必劳烦去敲那些引号和逗号(译注:Ruby 中 a = [ 'ant', 'bee', 'cat' ] 可以简写为 a = %w{ ant bee cat })。return 关键字也可以忽略。
  27.

      Ruby 有丰富的程序库可供使用。 Ruby 的程序库提供了对线程、套接字(socket)、有限的对象永续机制、CGI、服务器端可执行机制、DB 文件等许多功能的支持。Ruby 还对 Tk 有所支持,今后会有更多的支持。
  28.

      Ruby 有调试器(debugger)。 在完美世界里我们大约不需要调试器。可惜这并不是完美的世界。
  29.

      Ruby 可通过交互的方式来使用。 Ruby 设计为可以将其当作一种类似 Kornshell 的 shell 来使用。(这是本文中最令人质疑的观点,而且我也不得不承认,Ruby 并不是真正非常优秀的 shell。但我还是坚持认为,基于 Ruby 的 shell 是个不错的东西。)
  30.

      Ruby 是精炼的语言。 Ruby 中没有非必要的关键字,比如 Pascal 的 begin,if 之后的 then,while 之后的 do。不需要事先声明变量,因为变量无类型。不需要为方法指定返回类型。不需要 return 关键字;方法会返回最后被求值的表达式之结果。另外一方面……Ruby 不像 C 或 Perl 那么晦涩。
  31.

      Ruby 是面向表达的语言(expression-oriented)。 您可以像说话一样很容易写出 x = if a<0 then b else c end 这样的句子。
  32.

      Ruby 语言中系结了 syntax sugar(语法糖)。 (转述 Mary Poppins 的话说就是:一勺语法糖可以压一压语义的药味。"A spoonful of syntax sugar helps the semantic medicine go down.")只要您想,您就可以用 for a in x 来迭代遍历数组 x,可以用 a += b 来代替 a = a + b。大多数操作符其实只是简化的方法表示、更加直觉的名称以及更加方便使用的语法形式。

      译注:Mary Poppins 指的是美国1964年拍摄的经典电影《欢乐满人间(Mary Poppins)》。
  33.

      Ruby 支持操作符重载(overloading)。 如果我没记错的话,操作符重载源起自很久以前的 SNOBOL,但却是由较近的 C++ 振兴。这个机制可能会被滥用或误用,但有总比没有好。另外,Ruby 会自动定义操作符的赋值(assignment)版本,比如说,您定义了操作符 + ,那么您就会自动得到操作符 +=。
  34.

      Ruby 具有无限精度的整数算法 谁还关心 short、int、long 呢? 使用 Bignum 就行了。承认吧,您总还是想看看365的阶乘是多少。现在您可以看了。
  35.

      Ruby 具有幂运算操作符。 在过去年代,我们在 BASIC 和 FORTRAN 里使用过幂运算操作符。但是后来我们学会了 Pascal 和 C 语言,知道了这个操作符邪恶的一面。(我们被告知,我们甚至都不曾知道求值是如何完成的——是使用了对数还是迭代?效率有多高?)可是我们真的关心这些么?如果是,我们可以编写自己的版本。如果不是,Ruby 还提供了您珍爱的老好用的 ** operator 供您使用。享用它吧!
  36.

      Ruby 具有强大的字符串处理能力。 如果您想对字符串进行搜索、替换、修改、格式化、截断(trim)、分隔(delimit)、追加(interpose),或者字元化(tokenize)等操作,您可以使用 Ruby 内建的方法。如过内建方法不能满足要求,您可以利用内建方法来建构自己所需。
  37.

      Ruby 几乎没有违反自身规则的例外情况。 Ruby 的语法和语义比大多数语言更具自我完备性(self-consistent)。每种语言都有犄角旮旯,每种规则都有例外情况;但 Ruby 的旮旯和例外可能比您想象的要少。

分享到:
评论

相关推荐

    [转] ruby学习一个综合小练习

    标题中的“ruby学习一个综合小练习”表明这是一个关于Ruby编程语言的学习资源,可能是通过一个实际的小项目或练习来帮助学习者提升对Ruby的理解。描述中提到的“博文链接”指向了一个特定的博客文章,虽然没有给出...

    Ruby-一个Ruby的例子

    在这个"Ruby-一个Ruby的例子"中,我们将探讨Ruby的基础知识,以及如何通过具体的代码示例来理解其核心特性。 首先,Ruby的面向对象特性是其核心之一。在Ruby中,一切都是对象,包括基本数据类型如数字、字符串和...

    ruby的二进制字符串与hex互转,二进制字符串与整数互转的工具函数

    本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby-rubybuild编译和安装Ruby

    在Ruby开发中,为了管理不同版本的Ruby环境,我们常常会使用到`rbenv`和`ruby-build`这两个工具。本文将详细介绍如何使用`ruby-build`来编译和安装Ruby。 `rbenv`是一个用于管理全局或用户级别的Ruby版本的工具,它...

    Ruby-QRcode一个用于解析QR码的Ruby库

    Ruby-QRcode库是Ruby编程语言中用于生成和解析QR码的一个强大工具。QR码,全称为Quick Response Code(快速响应码),是一种二维条形码,可以存储各种数据,如文本、URL、联系人信息、日历事件等,并且在手机扫描...

    Ruby-CassandraDriverApacheCassandra的一个纯Ruby驱动器

    标题中的“Ruby-CassandraDriver”指的是一个专门为Apache Cassandra设计的Ruby编程语言的客户端库。Apache Cassandra是一个分布式的、高可用的、面向列的NoSQL数据库系统,常用于处理大规模的数据存储和检索。Ruby-...

    Ruby转JavaScript的编译器Opal.zip

    Opal 是一个 Ruby 转 JavaScript 的编译器. Opal 将 Ruby 源码转成 JavaScript 源码,运行速度很快,包含一个编译器、核心库和运行时实现。 标签:Opal

    Ruby-rubyinstall安装RubyJRubyRubiniusMagLevorMRuby

    通过这个工具,开发者可以轻松地在本地系统上设置多个Ruby版本,无需担心它们之间的冲突,这对于测试、开发和维护工作来说非常有用。 首先,让我们详细了解下这些不同的Ruby实现: 1. MRI (Matz's Ruby ...

    Ruby-TensorStream用Ruby重新实现TensorFlow

    Ruby-TensorStream是一个开源项目,旨在为Ruby开发者提供一个类似于Google TensorFlow的深度学习框架。它的核心目标是让Ruby程序员能够利用TensorFlow的强大功能,同时保持Ruby语言的优雅和简洁。这个项目在设计时...

    Ruby-Whois一个智能纯Ruby实现的WHOIS客户端与解析器

    Ruby-Whois是一个高效、灵活且完全用Ruby语言编写的WHOIS客户端和解析库。它设计用于查询域名、IP地址和其他WHOIS相关的记录,并能够处理各种服务器响应格式。这个库的强大之处在于它不仅可以发送WHOIS请求,还可以...

    Ruby-Squid一个Ruby库用于在PDF文件中绘制图表

    Ruby-Squid是一个专门针对Ruby开发者设计的库,它的主要功能是在PDF文件中绘制各种复杂的图表,从而为报告、分析或者其他需要图形展示的场景提供强大的支持。Ruby-Squid库利用了PDF处理的能力,使开发者能够轻松地...

    ruby DBI ruby DBI ruby DBI

    ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...

    Ruby-RubyJMeter一个基于Ruby的DSL用于构建JMeter测试计划

    Ruby-JMeter是一个强大的工具,它将Ruby编程语言与Apache JMeter测试框架相结合,为性能测试和负载测试提供了灵活且易于使用的领域特定语言(DSL)。这个工具使得测试人员和开发者能够用Ruby编写JMeter测试计划,...

    Ruby-RubyCompiler针对Ruby设计的AOTAOT编译器

    `pmq20-ruby-packer-90cc0d7`这个文件名可能是Ruby Compiler的一个特定版本或者一个打包工具,它可能包含了编译器的源代码、编译脚本或者预编译的库。使用这样的工具,开发者能够将他们的Ruby应用程序打包成更高效的...

    Ruby-LazyHighCharts一个简单和非常灵活的方式从ruby代码使用HighCharts

    Ruby-LazyHighCharts是一个针对Ruby编程语言设计的库,它提供了一种简单且高度灵活的方法来利用HighCharts库进行数据可视化。HighCharts是一个广泛使用的JavaScript图表库,用于在Web应用中创建高质量的交互式图表。...

    Ruby完全自学手册

    Ruby on Rails是一个使用Ruby语言编写的开源Web应用框架,其设计目的是为了减少Web应用开发过程中的重复工作,使得开发者能够遵循“约定优于配置”的原则,从而快速开发出功能强大的Web应用。Ruby on Rails是MVC...

    Ruby-Ruby的线性回归

    最后,它提到了“适用于SciRuby生态系统(Daru & IRuby)”,这表明它与这两个科学计算相关的Ruby库有良好的集成,Daru用于数据操作和分析,IRuby则是一个交互式Ruby环境,常用于Jupyter notebook。 标签“Ruby开发...

    RUBY 切换EXE

    为了解决这个问题,我们可以使用特定的工具将Ruby脚本转换为独立的可执行文件(EXE),这样用户无需安装Ruby环境也能直接运行。标题提到的“RUBY 切换EXE”就是指的这个过程。 ExeBundler(或Exerb)是这样一个工具...

    Ruby Under a Microscope An Illustrated Guide to Ruby Internals

    《Ruby Under a Microscope: An Illustrated Guide to Ruby Internals》这本书的标题和描述为我们揭开了Ruby语言内部工作机制的面纱。Ruby是一种以简单优雅的语法为核心的强大编程语言,但它内部所执行的无数不为人...

Global site tag (gtag.js) - Google Analytics