| |
|
这是一本关于Ruby程序设计的教程和参考书,使用Ruby你可以写出优良而高效的代码,并且充满乐趣。
夸张吗,但如果你读完这本书,我们相信你会同意的,我们的经验告诉我们这是真的。
编写Pragmatic Programmers系列的时候,我们尝试了很多的语言以期找到使我们的生活更加简易,使我们的工作更加出色的工具,但我们一次次被这些语言所挫败。
我们的目的是解决问题,而不是调试编译器,我们喜欢那些适合于我们的动态语言,没有强制的规则,我们需要通过代码就可以清楚地交流,我们看重在代码中精确有效地表述一个需求的简便能力,我们写的代码越少,出的错就越少。(并且我们的手腕和手指也会为此感到庆幸)
我们希望越高效越好,最好是我们的代码一次通过,编译器花费的时间就是我们那被偷走的开发时间。我们也希望能像编辑代码一样来测试代码,如果你等了两个小时来完成循环,你还不如使用穿孔卡片来完成你的工作呢。
我们想要一个工作在更高抽象层次的语言,越是高级的语言,我们花在转述需求给代码的时间就越少。
当我们发现了Ruby的时候,我们意识到我们找到了。相比我们曾经使用过的其它任何语言,Ruby把你解放了。你可以把精力集中在解决问题上而不是跟编译器和语法纠缠。它让你有机会成为一个更好的程序员,因为你可以把时间花在为你的用户提供解决方案,而不是为编译器。
Ruby使人心跳
先拿一个真正的面向对象的语言,比如SmallTalk,放弃陌生的语法而采用更方便的基于文件的源代码(译者注:此处译者不太明白),添加上像Python和Perl这些语言的柔韧和便利,你就得到了Ruby。
OO狂热迷会喜欢Ruby中的好多东西,比如纯粹的面向对象(任何东西都是对象),元类、闭包、迭代器和无所不在的异类集;Smalltalk用户会有回家的感觉;而C++和Java的用户会感到嫉妒;同时,Perl和Python的用户会发现许多他们所喜欢的特性:完整的正则表达式支持,与底层操作系统的紧密结合,方便的快捷方式,还有动态评估。
Ruby很容易学会,很简单就可以写出日常工作的代码,而且一旦你写好了,也很容易维护和升级。看起来很困难的事情往往没有实际上那么困难。Ruby遵循最小意外原则(注1),事情按你所设想的进行,只有很小的例外。这确实和你现在编程的方式不一样。
我们把Ruby称为透明语言,就是说Ruby不会让你的思路被无数的语法所蒙蔽,也不会为了完成简单的目的却要翻遍无数的支持代码,用Ruby写程序使你更接近于问题本身。你不用经常让你的思路和设计迁就于那些低级语言,用Ruby你发现你可以表达得直接而优雅。这意味着你可以更快地编写代码,也意味着你的代码可读和可维护。
使用Ruby,我们经常惊讶于一次可以写那么多代码,而且这些代码一次就通过,很少会有语法错误,没有类型障碍,远少于通常的Bug。很少会出错,没有令人讨厌的行尾分号,没有为了保持同步而让人厌烦的类型声明(尤其是分隔的文件),没有多余的语句仅仅是为了让编译器高兴,没有易错的框架代码。
所以,为什么学习Ruby?因为我们觉得它有助于你更好地编程,有助于你把精力集中到手头上的问题而不分心,它能使你的生活变得更容易。
Ruby是一种什么样的语言?
在从前,语言之间的区别是很简单的,或者是编译语言,就像C或者Fortran,或者是解释型语言,像BASIC。编译语言给你速度和低级访问,解释语言高级但是却很慢。
时代在改变,于是乎事情就变得不再简单了。一些语言的设计者渐渐把他们的创造品呼为“脚本语言”。我们猜想他们的意思是他们的语言是被解释执行并且可被用来代替批处理文件和shell脚本,把其它程序和底层操作系统协调组织在一起,Perl、TCL、Python现在都被称为脚本语言。
那怎样才能被称为是一门真正的脚本语言?坦白讲我们也不知道这种区别是否值得探寻。在Ruby中,你能访问所有的底层操作系统特性,Perl和Python能做的你都可以用Ruby来做,而且更简洁。Ruby根本的区别在于,它是一个有着坚实理论基础和优雅简洁的语法的程序语言。你可以把Ruby脚本搞得很乱,但基本上你不会这样做。而是更倾向于提供一个解决方案来写出这样的一套程序,它更容易理解,维护简单,很容易在将来扩展和重用。
尽管我们把Ruby用在处理脚本工作上,不过大多数时候我们还是把它看作多用途的程序语言。我们用它写GUI应用和中间层服务器过程,我们还用它排列这本书的格式,还有人用它管理服务器和数据库。Ruby用在Web页上,可以提供数据库接口和动态内容。有人用Ruby写人工智能和机器学习的程序,而且至少有一个人用它来研究自然进化。Ruby为数学研究也提供了很大帮助。全世界的人们使用它把他们各自不同的程序结合在一起。Ruby真的是一门伟大的语言,为许多领域的问题解决提供了帮助。
Ruby适合我吗?
对于程序员来说,Ruby不是万能药。有时,你会需要特定的语言:也许是环境使然,也许你需要专门的库,也许涉及到性能,或者仅仅因为培训的内容。我们不会完全放弃像Java和C++这样的语言(尽管我们希望有这一天)。
不过,Ruby可能比你所能想象到的还要适合你。它易于扩展,很容易就能和第三方库联编。它跨平台,相对来说是一种轻量级语言,消耗很少的系统资源。学习起来容易,我们曾经认识一个人,他只看了一天这本书,就能把Ruby代码写到他的产品系统中了。我们曾经用Ruby实现了一个X11窗口管理器的一部分,而这正常情况应该是用C完成的。Ruby帮助我们在几小时内写出其它语言需要几天时间的代码。
一旦你体会到Ruby的舒适,我想你会掉过头来选择它作为你的程序语言了。
Ruby版本
本书使用1.6版的Ruby,2000年9月发布。
Ruby版本的编号方式和其它开源软件一样,有着偶数子版本号(1.0、1.2、1.4等等)的发布是稳定、公开的发布。它们预先包装好然后发布在各Ruby网站上。
开发版有奇数子版本号,就像1.1和1.3,这需要你下载后自己来build,就像xxvii页上描述的那样。
安装Ruby
你可以从ftp://ftp.netlab.co.jp/pub/lang/ruby获得Ruby,或者从526页的附录C镜像站点列表中获得。你可以找到最新的稳定发布,也有许多开发版的发布。
你能找到Ruby的源代码发布,也可以找到适用于Windows或者其他操作系统的二进制发布(比如适用于Windows的二进制发布在http://www.pragmaticprogrammer.com/ruby/downloads/ruby-install.html)
提示:最最新的Ruby
对那些需要最最新版本的人(就像我们写这本书一样),你可以从开发者的工作仓库直接得到开发版。
Ruby开发者使用CVS(Concurrent Version System,从http://www.cvshome.com处免费得到)作为他们的修订控制系统。你可以匿名登陆然后执行下面的CVS命令:
% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
login
(Logging in to anonymous@cvs.netlab.co.jp)
CVS password: guest
% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
checkout ruby |
开发者最新留下的完整源代码树就拷贝到你的机器里的ruby目录了,从地球的另一边升级你本地的源代码树,这不是很美妙吗?
编译Ruby
在Ruby的发布中你可以找到一个叫README的文件,里面声明了安装的细节。简单说,在POSIX-based系统上编译Ruby使用四个命令,和其它开源软件一样:./configure,make,make test和make install。你也可以在其它环境下编译Ruby(包括Windows),使用POSIX模拟环境比如cygwin[参看http://sourceware.cygnus.com/cygwin]。或者使用本地编译器----参看win32目录中的ntsetup.bat。
运行Ruby
安装了Ruby后,你可能希望运行一下程序试试看。不象编译环境,运行Ruby有两种方式----交互或者作为一个程序。
交互运行Ruby
交互运行Ruby最简单的方式就是在命令行中输入ruby:
% ruby
puts "Hello, world!"
^D
Hello, world! |
这里我们输入了一个简单的puts表达式和一个文件结束符(在我们的系统上是CTRL-D)。它虽然能运行,不过你要是希望排版的话还是有点儿痛苦,并且你也看不到你输入的代码如何运行。
在sample目录中你可以找到一个叫eval.rb的脚本,它稍微好一点儿,因为你输入的每一个表达式的值它都会显示:
% cd sample
% ruby eval.rb
ruby> a = "Hello, world!"
"Hello, world!"
ruby> puts a
Hello, world!
nil
ruby> ^D
% |
这里我们能看到puts的输出和返回值(就是nil)。
看上去很不错,就是你不能使用多行的表达式,并且不能编辑行,也不能返回使用原来的行(就像在shell中使用历史命令那样)。
比eval.rb更好的是irb----Interactive Ruby。irb是一个Ruby Shell,有完整的历史命令行,可以编辑行。你可以配置它的许多选项,在517页有它的附录。我们建议你熟练使用irb,这样就可以运行我们的大多数交互例程。
Ruby程序
最后,你可以从一个文件中运行Ruby程序,就像其它Shell脚本,Perl程序,或者Python程序。你可以简单地把脚本名称作为参数来运行Ruby程序。
或者你可以使用Unix "shebang"符号作为你的程序文件的第一行。[如果你的系统支持的话,你可以在shebang行的Ruby路径中使用#!/usr/bin/env ruby来避免hard-coding,这会在你的路径中寻找ruby然后执行它。]
#!/usr/local/bin/ruby -w
puts "Hello, World!" |
如果你把源文件设置为可执行(比如,使用chmod +x myprog.rb),Unix让你把文件当作程序一样运行:
% ./myprog.rb
Hello, World! |
在微软Windows中你可以使用文件关联实现相同的功能。
资源
访问Ruby站点,http://www.rubycentral.com和http://www.ruby-lang.org,看看最新的信息,和新闻组或者邮件列表中其他的Ruby用户聊天(参看附录C)。
我们也希望能收到您的反馈:注释,建议,文本中的错误,例子中的疑问统统欢迎,我们的E_Mail:rubybook@pragmaticprogrammer.com
如果你要告诉我们书中的错误,我们会加到勘误表中:
http://www.pragmaticprogrammer.com/ruby/errata/errata.html
最后,http://www.pragmaticprogrammer.com/ruby中有书中的例子的源代码,按页存放。
感谢
一本书是一项庞大的工程,我们不可能在没有帮助的情况下完成它,谢谢帮助我们的所有的朋友,不管老的还是新的。Mike Hendrickson, John Fuller, the ever-helpful Julie Steele, and the wonderful Julie DiNicola. 谢谢你们。
我们的书评人也是很奇妙的。George Coe、Bob Davison、Jeff Deifik、Hal Fulton、Tadayoshi Funaba、Clemens Hintze、Kazuhiro Hiwada、Kikutani Makoto、Mike Linksvayer、Aleksi Niemel、Lew Perin、Jared Richardson、Armin Roehrl、Conrad Schneiker、Patrick Schoenbach、and Eric Vought。
一些人帮我们完成了本书的一些部分。Tadayoshi Funaba 和我们交换了数不清的邮件,直到我们最后理解了Date模块。Guy Decoux和Clemens Hintze耐心地回答我们关于Ruby扩展的问题。Masaki Suketa使我们搞明白了WinOLE模块。
Ruby最初的大多数文档都是日语写的,不过现在也产生出越来越多英译作品,有很多值得记住的作者名字,在这里我们只选出Goto Kentaro,他已经出品了很多高质量的文章,并且把它们放在网上。
最后,我们一定要感谢Yukihiro "Matz" Matsumoto,Ruby的作者。我们已经记不清问了他多少问题,还有他耐心的回答,除了发明了一个非常棒的语言,他也培养了一个令人惊奇的支持社群和开放文化,这是这门语言能够兴隆的所在。
谢谢你们所有的人。Domo arigato gozaimasu。
Dave Thomas 和 Andy Hunt
THE PRAGMATIC PROGRAMMERS
http://www.pragmaticprogrammer.com
符号约定
贯穿整本书,我们采用下面的排版符号。
例子中的文字编码采用打字机字体:
class SampleCode
def run
#...
end
end |
Fred#doIt是Fred类的一个例程方法的引用,而Fred.new[有的Ruby文档把类方法写成Fred::new,这是一种完全合法的Ruby语法,不过我们刚刚发现Fred.new读起来不容易转义。]是类方法,Fred::EOF是类常量。
书中包含了许多Ruby代码片断。我们尽可能写出它们运行后的结果,简单的情况下,我们在表达式的同一行中写出表达式的值,比如:
有时,我们也对一些赋值语句感兴趣,我们就这样:
a = 1 >> 1
b = 2 >> 2
a + b >> 3 |
如果程序执行后产生出复杂的输出,我们就在代码下面写出结果:
| 3.times { puts "Hello!" } |
produces:
在一些库文档中,为了指出输出中有空格,我们" "表示(译者注:这里是一张小图片,我们用正常的空格表示,有必要的话会注明)。
命令行使用Roman字体,参数使用italic字体,可选参数括在方括号中:
ruby [
flags
]*
[
progname
] [
arguments
]+ |
[注1]:
最小意外原则主要针对界面而不是代码,看一个小小的例子就可以明白:
不好的界面:
int multiply(int a, int b)
{
return a + b;
}
好的界面:
int multiply(int a, int b)
{
return a * b;
}
或者这样:
int add(int a, int b)
{
return a + b;
}
但这个却不好:
int write_to_file(const char* filename, const char* text)
{
printf("%s\n", text); /*看出来了吗,filename并没有使用*/
}
最小意外原则一般指给用户最少的意外,有人总结了Ruby的最小意外原则是:
1、中庸
不要让用户去猜你的意图
也不要把他们当作傻瓜
2、总会存在意外
因为有误会的可能
背景知识不同也是一个原因
3、意外也分好坏
好的意外是因为它使你的代码看起来very good
不要经常重复地出现意外
4、自然而不是简单
简单不是最终目标
本书的作者认为Ruby的最小意外原则是事情按你所设想的进行,只有很小的例外。还有很多人对这个原则阐述了自己不同的观点,可以在google中搜索。
Larry Wall是Perl的作者,他很幽默,在回答网友的问题时他提到“很多方面上我还是很喜欢 Ruby 的,这是因为那些部分是从 Perl 借过去的。:-)Ruby 的主要问题在于它的最小意外原则可能让人误入歧途,要减少谁的意外?专家和初学者对不同的事情感到意外,从一个小程序写成大程序的人和从开始就写大程序的人可能对不同的事情感到意外”。
有趣的是,Matz并不认为Ruby遵循什么最小意外原则,在2003年9月和Bill Venners的谈话中,Bill Venners问他Ruby为什么要遵循最小意外原则,Matz回答说:“我并不没有声明Ruby遵循最小意外原则,有人觉得Ruby的设计符合这个原则,所以他们就这样传说,实际上我可不这样认为。我希望在编程的时候尽量减少挫折,这是设计Ruby的初衷,我自己在编程时得到了很多乐趣,等到Ruby公布以后,很多人说他们也感受到了我的感受,所以他们就开始说Ruby遵循最小意外原则,事实上这是误导。因为每个人的技术背景不同,有人来自Python社区,有人来自Perl社区,他们各自为Ruby的不同方面感到意外。然后他们找到我说,“我对这种语言的这个特性感到非常惊讶,所以Ruby违反了最小意外原则。”等等。最小意外原则不是为你一个人设置的,等你非常好的掌握了Ruby以后再来谈最小意外原则吧。比如,我在开始进行Ruby设计以前是一个C++程序员,用C++进行开发有两三年,但是就算是在我使用了两年C++以后,C++还是经常使我感到意外”。
[注1由夏克补充] |
|
| 版权声明:RUBY文档中心的所有文章标明[原创]的均为本站作品,版权属RUBY中文化计划,若转载请注明;标明[翻译]的其外文版权归原作者,译文版权属RUBY中文化计划;标明[转贴]的,若原作者感到侵犯了他的著作权,那么请及时跟主持人联系,我们会尽快更正。 |
|
|