Ruby Practice – Getting Started

读了两部关于Ruby的著作——Programming Ruby(第一版)和Why’s (poignant) guide to Ruby (PDF),感觉像狗熊掰苞米,读的时候全懂,读完了全忘了。另外,关于Ruby的资料比较少,更新也不是太及时,参考手册还是关于1.4.6版本的,而Ruby已经是1.8.4了。Ruby的书就更少了,国内似乎还没有卖的?!不知道大家都是怎么学的?当然,对于“不求甚解”的人来说,现有的资料也够用了,只是读起来有点烦,冗余的东西太多,毕竟咱不是刚开始学编程,有些初级的东西还要翻来覆去地讲,就显得罗嗦了。还有就是实践讲得少,我很想知道有没有类似CPAN的东西,如果有的话,它在哪里?如果没有,我该到哪里去找库,然后如何安装、使用等等。

Ruby是面向对象的,而我学过C++;Ruby是脚本语言,我也用过Perl。我相信,这两方面的背景对于学习Ruby肯定是有帮助的,所以,我很希望能够看到这样的学习资料,它能利用我所拥有的这些知识,一方面去除冗余信息,另一方面通过适当比较,让我迅速上手Ruby。

遗憾的是,目前还没有找到既讲述实践过程,又能利用我的背景知识的学习资料,没办法,只好自己站出来,为自己写一份文档,顺便填补一下国内(国际?)空白吧。:-)

由于是初学Ruby,而且第一次写这样的文档,希望大家多多批评,多提宝贵意见。

言归正传。

Ruby的官方网站地址是http://www.ruby-lang.org/en/,它还有很多附属网站,如ruby-docrubygardenrubyforge,和Ruby Central等等,在官方网站上都有链接,可惜其中几个我这里无法访问,说什么“服务器响应时间过长”,不知道为什么。Ruby中国尚在建设中,还没有内容,不知道是谁在做?

Ruby的语言简介列出了它的重要特性,这里不再赘述。我也不打算推销Ruby,是否要学它由每个人自己决定,我个人的目的是想看看传说中的Ruby on Rails到底是什么样子,以及如何利用它做开发。当然,这份文档将尽力为那些已经决定开始学习Ruby的朋友提供帮助。

Ruby是一种脚本语言,所以,必须有一个解释器,才能运行Ruby程序,官方下载页面为http://www.ruby-lang.org/en/20020102.html。Ruby支持多种平台,对于Fedora用户来说,可以使用如下方式安装Ruby及其相应工具。

$ su -c 'yum install ruby ruby-libs ruby-devel ruby-irb ruby-ri ruby-docs'
ruby
这个rpm包含有Ruby语言的解释器:ruby。
ruby-irb
这个rpm包会安装一个名为irb的执行程序,它是交互式Ruby(Interactive Ruby)的简称,用来从标准输入读入并执行Ruby表达式的工具,像一个shell。这种工具太适合我这种懒人了,免去了创建文件夹、命名文件等一系列繁琐的工作。不知道Perl有没有相应的工具?
ruby-ri
和Perl一样,Ruby也设计了嵌入式文档。ri就是查看文档的工具,令我好奇的是,为什么它不叫rubydoc,而是起了这么一个古怪的名字?

让我们从“Hello, world”开始吧!

$ irb
irb(main):001:0> print "hello, worldn"
hello, world
=> nil
irb(main):002:0>

大于号之前是irb的提示符,如irb(main):001:0>其中irb指当前运行的程序名字,main指当前对象的名字,001指当前行数,0指缩进几层。在我们输入print "hello, world"后,irb打印出hello, world=> nil,其中hello, world是print打印出来的内容,=>后面是其返回值,nil相当于说print的返回值为void。我们也可以把这个程序存到文件(如hello.rb)里,Emacs有ruby-mode,方便写Ruby程序,不过还没有rubydb,所以调试程序可能还是要在命令行下。

#!/usr/bin/ruby

print "hello, worldn"

然后运行这个程序:

$ ruby hello.rb
hello, world

这时屏幕上只会打出hello, world,返回值信息就没有了。Ruby的命令行选项几乎和Perl一模一样,比如检查语法的-c选项。

$ ruby -c hello.rb
Syntax OK

值得注意的是,同一个程序用ruby执行和在irb里面运行可能会得到不同的结果,原因是irb读一行执行一行,而ruby读入整个程序之后才会执行,因此一些无法通过(ruby)编译的程序却可以在irb里面运行。

下面让我们看看print是怎么回事。

$ ri print
More than one method matched your request. You can refine
your search by asking for information on one of:

     Kernel#sprintf, Kernel#printf, Kernel#print,
     Zlib::GzipWriter#printf, Zlib::GzipWriter#print, StringIO#printf,
     StringIO#print, IO#printf, IO#print, CGI#print
/tmp/ri_4875.0 (END)

Perl缺省的package是main,而Ruby里面是Kernel,准确的说应该叫module。先不管它,让我们看看Kernel#print,先按q退出当前ri,然后:

$ ri Kernel#print
----------------------------------------------------------- Kernel#print
     print(obj, ...)    => nil
------------------------------------------------------------------------
     Prints each object in turn to +$stdout+. If the output field
     separator (+$,+) is not +nil+, its contents will appear between
     each field. If the output record separator (+$+) is not +nil+, it
     will be appended to the output. If no arguments are given, prints
     +$_+. Objects that aren't strings will be converted by calling
     their +to_s+ method.

        print "cat", [1,2,3], 99, "n"
        $, = ", "
        $ = "n"
        print "cat", [1,2,3], 99

     _produces:_

        cat12399
        cat, 1, 2, 3, 99

/tmp/ri_4896.0 (END)

让我们暂时忽略几个熟悉的面孔($,$),先掌握好这几个命令行工具,再来学习语法细节吧。

One thought on “Ruby Practice – Getting Started

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据