读了两部关于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-doc,rubygarden,rubyforge,和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)
让我们暂时忽略几个熟悉的面孔($,
和$
),先掌握好这几个命令行工具,再来学习语法细节吧。
不错,对于我第一次接触ruby的人来说的确不错!