面向对象编程语言 Ruby 1.9.3 RC1 发布

fmms 13年前
     <p>Ruby 1.9.3 RC1 发布了,这是 1.9.3 的第一个 RC 版本,该版本兼容 1.9.2 包含了一些新特性,例如 io/console 等。详细改进记录请看 <a href="/misc/goto?guid=4958191729282412138" target="_blank">ChangeLog</a>。</p>    <p>下载地址:<a href="/misc/goto?guid=4958191730026071116" target="_top">ruby-1.9.3-rc1.tar.bz2</a></p>    <p><img title="ruby" border="0" alt="ruby" src="http://www.ruby-lang.org/images/logo.gif" /><br /> Ruby 是一个注重均衡的语言,它的发明者<a href="/misc/goto?guid=4958191730764426992">松本行弘 Yukihiro “matz” Matsumoto</a>,混合了他喜欢的语言(Perl、 Smalltalk、 Eiffel、 Ada 和 Lisp ) 产生了一种具有函数式及指令程序设计特性的新语言。</p>    <p>他常说,他是“试着让 Ruby 更自然,而不是简单,就像生活一样”。</p>    <p>除此之外,他还提到:</p>    <p>Ruby 就像人的身体一样,表面上看来简单,但是内部却相当的复杂[1]。</p>    <h3>Ruby 的成长</h3>    <p>在 1993 年,没有人会相信一个由日本业余语言设计者创建的面向对象的语言,能最终在世界范围内被广泛使用并且变得几乎像 Perl 那样流行。自从 1995 年 Ruby 公开发表以来,Ruby 在全球吸引了许多忠实的程序设计员。在 2006 年,Ruby 被广泛接受。在各大城市都有活跃的使用者并通过社区举办许许多多场场爆满的研讨会。</p>    <p style="float:right;"><img style="padding-left:8px;" title="Graph courtesy of Gmane." alt="Graph courtesy of Gmane." src="http://gmane.org/plot-rate.php?group=gmane.comp.lang.ruby.general&width=280&height=140&title=Ruby-Talk+Activity+over+4+Years" /></p>    <p>在 Ruby-Talk,主要的<a href="/misc/goto?guid=4958191731495303335"> 邮件列表</a> 上,讨论 Ruby 语言的文章爬升到每日 200 封。</p>    <p>在 <span class="caps">TIOBE</span>, 最流行的开发语言排名调查中, Ruby 排名为全球第 11 位。 根据这样的成长情况,他们预测“在半年之中 Ruby 将会进入最受欢迎开发语言的前 10 名。”有越来越多受欢迎的软件如 Ruby on Rails web framework<sup><a href="/misc/goto?guid=4958191732240269415">2</a></sup> 是使用 Ruby 撰写而成,也是造成 Ruby 如此快速成长的原因。</p>    <p>Ruby 是<a href="/misc/goto?guid=4958191732975632985">开源软件</a>。 不只是免费,而且可以自由的使用、复制、修改与发布。</p>    <h3>所见到的都是对象</h3>    <p>最初,Matz 从其它语言中找寻理想的语法,在网络上他做了一段时间的调查,找到候选如“Perl“和“Python“。但都不是他想要的,他需要一个比 Perl 更强大、比 Python 更面向对象的语言[3]。</p>    <p>在 Ruby 中,所有的东西都是对象,所有的信息和代码都可以给它们所拥有的属性和行为。面向对象程序设计中称属性为实例变量(<em>instance variables</em>),称命令为方法 (<em>methods</em>)。 从下列程序代码中看到 Ruby 能够给数字赋于行为,从这点可以证明 Ruby 是纯面向对象的语言。</p>    <pre class="code ruby-code"><code><span class="number">5</span><span class="punct">.</span><span class="ident">times</span> <span class="punct">{</span> <span class="ident">print</span> <span class="punct">"</span><span class="string">We *love* Ruby -- it's outrageous!</span><span class="punct">"</span> <span class="punct">}</span></code></pre>    <p>在许多语言中,数字和其它原生的类型都不是对象。而 Ruby 受 Smalltalk 语言影响,让所有的类型都可以赋予方法及产生实例变量,并让这些规则适用于 Ruby 所有对象。</p>    <h3>Ruby 的灵活性</h3>    <p>Ruby 是一个相当灵活的语言,她允许用户去改变她本身。 Ruby 的核心部分可以被更改或重新定义,模块可以被添加。Ruby 试着不去妨碍程序员。</p>    <p>比如(<code>+</code>) 是用做加法的运算符。如果你更喜欢使用易读的 <code>plus</code> 的话,你可以给 Ruby 的内建 <code>Numeric</code> 类添加一个函数。</p>    <pre class="code ruby-code"><code><span class="keyword">class </span><span class="class">Numeric</span>   <span class="keyword">def </span><span class="method">plus</span><span class="punct">(</span><span class="ident">x</span><span class="punct">)</span>     <span class="constant">self</span><span class="punct">.+(</span><span class="ident">x</span><span class="punct">)</span>   <span class="keyword">end</span> <span class="keyword">end</span> <span class="ident">y</span> <span class="punct">=</span> <span class="number">5</span><span class="punct">.</span><span class="ident">plus</span> <span class="number">6</span> <span class="comment"># y is now equal to 11</span></code></pre>    <p>Ruby 的符号只是语法的甜头 (syntactic sugar)。你可以随时重定义他们。</p>    <h3>Blocks,一个独特且强大的特性</h3>    <p>Ruby 的代码块是非常强大的。程序员可以给任何函数添加一个密封 (closure) 来表述这个函数该如何工作。密封也被叫做代码块,是用过其他比如 <span class="caps">PHP</span>, Visual Basic 等规则语言的 Ruby 的初学者最喜欢使用的一个功能。</p>    <p>代码块取自函数语言。Matz 说:“我希望在 Ruby 的密封中融入 Lisp 的文化 [4]。”</p>    <pre class="code ruby-code"><code><span class="ident">search_engines</span> <span class="punct">=</span>     <span class="punct">%w[</span><span class="string">Google Yahoo MSN</span><span class="punct">].</span><span class="ident">map</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">engine</span><span class="punct">|</span>     <span class="punct">"</span><span class="string">http://www.</span><span class="punct">"</span> <span class="punct">+</span> <span class="ident">engine</span><span class="punct">.</span><span class="ident">downcase</span> <span class="punct">+</span> <span class="punct">"</span><span class="string">.com</span><span class="punct">"</span>   <span class="keyword">end</span></code></pre>    <p>在上面的代码中,代码块是在 <code>do ... end</code> 中的结构。 <code>map</code> 函数将代码块应用到一个词的列表中。Ruby 的其他函数经常会为程序员留出一个空当给代码块来控制函数的功能。</p>    <h3>Ruby 与 Mixin</h3>    <p>于其他面向对象语言不同,Ruby “有意”只提供单继承。不过 Ruby 拥有模块(在 Objective-C 里面叫做类别)。模块是把许多方法放在了一个类别里。</p>    <p>类可以混合一个模块,得到这个模块提供的所有方法。比如所有提供 <code>each</code> 方法的类可以混合 <code>Enumerable</code> 模块,来得到这个模块提供的所有方法,当然这些方法都会调用 <code>each</code> 做循环。</p>    <pre class="code ruby-code"><code><span class="keyword">class </span><span class="class">MyArray</span>   <span class="ident">include</span> <span class="constant">Enumerable</span> <span class="keyword">end</span></code></pre>    <p>一般来说,Ruby 爱好者相对于复杂和限制颇多的多态继承方法来讲更偏向于这种混合方法。</p>    <h3>Ruby 的面貌</h3>    <p>尽管 Ruby 只用很少的符号并且偏向与英文单词做关键字,但是少量的符号也被用来装饰 Ruby。Ruby 不需要提前定义变量。它用简单的命名法来提示变量存在的范围。</p>    <ul>     <li><code>var</code> 可以是局部变量。</li>     <li><code>@var</code> 是一个实例变量。</li>     <li><code>$var</code> 是一个全局变量。</li>    </ul>    <p>这些信号让程序员更清楚的看到每一个变量的角色,增强了程序的可读性,也不需要在实例变量前面加上 <code>self.</code> 了。</p>    <h3>更上一层楼</h3>    <p>Ruby 还有其他丰富的特性:</p>    <ul>     <li>Ruby 有类似于 Java 和 Python 的异常处理,使处理错误更方便。</li>    </ul>    <ul>     <li>Ruby 有一个真正的表示-清扫(mark-and-sweep)垃圾手机器来出来所有的 Ruby 对象。不需要在库里维护引用数了。就像 Matz 说的:“这对您健康有意。”</li>    </ul>    <ul>     <li>为 Ruby 写 C 的扩展比 Perl 和 Python 更容易。Ruby 有一个非常雅致的 <span class="caps">API</span> 从 C 语言调用 Ruby。这包括把 Ruby 作为嵌入式脚本语言时,从其他软件里调用 Ruby。SWIG 界面也是可选的。</li>    </ul>    <ul>     <li>Ruby 可以在操作系统允许的情况下动态调用库。</li>    </ul>    <ul>     <li>Ruby 提供不依赖操作系统的线程。所以在所有 Ruby 支持的操作系统里都可以使用多线程处理,不管操作系统支不支持,比如 MS-DOS!</li>    </ul>    <ul>     <li>Ruby 极为轻便:它只要是在 <span class="caps">GNU</span>/Linux 上开发的,但也在很多类型的 <span class="caps">UNIX</span> 上运行,也支持 Mac <span class="caps">OS X</span>, Windows 95/98/Me/NT/2000/XP,DOS,BeOS,OS/2 等。</li>    </ul>