Ror正在以惊人的速度增长着,特别是在经常光顾JavaEye的时候发现Ror已经在国内有很好的基础了,当然要凑个热闹尝尝鲜 咯。
目前国内Ror的中文资料还是很少的,到网上找找就只有Eiffel Qiu的 Ruby on Rails实践(以下简称为Ror实践),想必是如果有朝一日Ror成就大业了,那么国内肯定本文的作者肯定就是国内Ror的开山鼻祖咯。毕竟Ror是新事务,像我这种只能勉强看看E文的人肯定很多的,如果直接就拿来那种大部头的文档来读,估计是很难入门了。所以大家都要好好学习E文哦,然后多多将自己的心得都共享出来,这样进步才快哦,在此我们应该像Eiffel Qiu致敬!
我只会Java,从我的角度看,Ror能有如此大的影响力,很大一部分原因就是它成功的解决了J2EE开发的痼疾:烦琐,我知道Ror也是因为国内各大技术网站牛人纷纷投入到Ror能不能取缔Java的讨论中,以至于很多标题如“Java将死?”这样令人血脉喷张的题目都到处泛滥。有这样的坚实基础,加上Ruby自身的成熟度(Yukihiro Matsumoto 93年就开始着手开发Ruby,也就是和Java同岁),而Ruby和Rails也都是从头开始的东西,没有任何历史负担,想必将来定会在Web开发领域占据一席之地,至于Ror能有多成功,俺无法预言。而且都说每个程序员都该在掌握一门静态预言的同时再掌握一门动态语言,我想这个时候投入到Ror的学习之中是必要的。个人认为Ror只是专注于Web开发的,特点就是快速开发,而J2EE开发本身就不是以效率见长,所以个人认为Ror对Java本身不构成太大威胁,有人认为Ror会对.NET产生很多影响,想想JavaEye的升级版中已经移除了.NET版,看来微软的日子还真是每况愈下。的确Ror有机会抢占很大一部分Web开发的市场份额,那么我们吃Java这口饭的人也可以考虑将视线向J2ME或者Swing等方向运动下,毕竟Java已经不再是单纯的语言,而是一个平台。
很多愤青都有这样的想法:Ruby是日本的,是日本的我就不学。对此看法我只能是不屑一顾,技术无国界,为了世仇就阻碍了发展,肯定是短视行为,真希望有朝一日国人也能出一个Yukihiro Matsumoto ,那我就立马放弃Ruby。
在准备了很多天之后,终于寻找到了不加班的双休,于是我开始了奇妙的Ror之旅。
本来想在Linux上开始的,但是鉴于我对Linux仍然太陌生,所以继续学习XP上的开发,今后在时间允许的情况下肯定是要抽时间学习Linux和Unix,想玩好Ror或者说想做好程序,Linux/Unix不学不行。
按照Ror实践的做法,下载了一个ruby185-21.exe,然后安装,接下来打开控制台执行 gem install rails --remote,郁闷的时间正式开始了,我不知道别人是怎么样的,反正我打开RubyForge是非常的慢,简直就是打不开,估计是Ruby太火了,网站有点吃不消。然后我就反复执行着gem install rails (换了 --include-dependecies还是不行),一直都是Timeout error,没办法,直接下载rail安装文件,这次更离谱,连下载页都打不开,我哭。继续第三种方法,下载InstantRails,HOHO,我觉得这种一站式的解决方案真实再次印证了Ror习惯约定优于配置的理念,不过还是在心里琢磨着习惯了用这个如果自己去Linux上手动配置该怎么办,所以用InstantRails之前我可是挣扎了好久,毕竟是刚入门,用太自动化的工具一直是不被推荐的。
使用InstantRails感觉很像在使用Visual Studio,而且IR连数据库都为你准备好了,那还等什么呢,赶快动手编写HelloWorld吧^_^。但是实际上也不是那么简单的,至少使用IR的话Ruby是不可以随便用的,必须使用IR提供的控制台,或者说必须要到%IR_HOME%/rails_app目录下面才能执行Ruby命令,我不知道我是否有误操作或者理解错误,因为我在自己手动安装Ruby的时候ruby已经被看作是系统命令,但是用IR的话就不那么方便了,而且工作目录不同相同的命令结果也是不同的。比如我要用rails命令新建一个工程,那么应该在%IR_HOME%下面执行 rails [project_name] 才能正常运行,后面的ruby script/server 活着script/generate也都是有相同的问题,我也是折腾了好半天才搞定Ror实践上的例子(从安装到做完那个例子用了我5个小时的时间,可能是俺天分比较差T_T)。
基本上使用IR完成那个例子的步骤如下:
1、解压InstantRails到一个目录下%IR_HOME%,所有的文档上都会告诉你目录名不能有空格,在java里就已经是约定俗成的事情,任何文件、目录名都该尽量避免非英文字符、空格等,不一定说是不行,但是这个明显是在给自己找麻烦。
2、运行%IR_HOME%/InstantRails.exe,IR控制台,显示Apache、MySQL服务器均以启动。
3、打开控制台,进入%IR_HOME%/rails_apps目录,或者在IR控制台按I Button,选择Rails Application->Open ruby console windows,然后敲命令rails MyTest,创建MyTest project。稍等片刻,看到控制台打出一串create files的记录,到%IR_HOME%/rails_apps下面发现多了一个MyTest文件夹,里面包含了Rails的skeleton框架。
4、按照Ror实践上的说明依次进行操作即可,这份文档真可谓是手把手的入门教程,我们菜鸟的福音:P,在生成controller、model文件的时候在%IR_HOME%/rails_apps/project_name下输入命令ruby script/generate 这样的命令才能运行。
在完成这个动作以后,也算是切身体会了Ror的易用性,不过对于我这种天分低的人来说这个过程可不是那么好玩的,光是安装一个Ror就把我的耐心磨的差不多了,衷心希望Ror能更火点,那样RubyForge就可以像SourceForge一样有影响力了,就可以全世界的部署镜像服务器,那样俺下载就方便多了:P。在体验了Ror之后我想真正的学习才开始,我选择了Ruby in a Nutshell作为Ruby的教程,在接下里的日子里我要先了解Ruby的语法,然后才好继续下去。因为没有玩过python、Perl这样的预言,所以刚接触Ruby的语法简直就是看天书,而Ruby in Nutshell中却反复提到Ruby语法与Perl、Python很相似,明显打击我么 :(。哦,对了,Ruby还挺像C++的,非常喜欢用很多符号来表达关系,看惯Java程序后真是觉得Ruby的代码像是在画抽象画,看来熟悉Ruby语法肯定没有熟悉Java那么快,那么易懂咯。
接下来就是Ruby的语法,我在网上搜了好半天也没发现Ruby语法的具体讲解,想想当年学Java或者C#的时候都是满眼的教程、文档和网页,而且还有各种例子帮助理解,基本上大体看看就可以用了,但是Ruby就没那么好玩了,去Ruby官网上看了一圈也没找到(可能我搜索的能力太弱),就只好从Ruby in Nutshell里面一点点看了,所以我的笔记里面也没有例子,不知道过些时日我会不会自己也看不懂 :(。
Ruby in Nutshell中分以下几个部分讲解:
1、Command-Line Options,由于我们都是Project Oriented,所以这些内容就要等到我想用的时候才会去查了。暂时略过。
2、Environment Variables,略过(理由同上)。
3、Lexical Conventions,文字约定,包括whitespace, Line Endings,Comments,Indentifiers,Reserved Words,看上去基本是和其他语种查不太多的。与Java不同的地方是: 如果你写 a + b 代表 a+b,而写a +b代表的则是a(+b),in this case ,is a method call(这样写居然是一个方法调用的写法,明显空格是不能再滥用了),HOHO ,感觉Ruby太随便了,真不知道如果大规模采用Ruby的话一个工程会变成个啥样子;结尾没有分号作为换行标志,如果想分行写可以用+,-或者backslash(这里不知道意思是不是左右斜杠都可以作为连字符,以后会试试),呵呵,有点VB的味道,没啥特别的;comments 以#开头,还可以用=begin ... =end来做多行注释(再次抗议小鬼子的随便行为!);保留字,有40个,具体我也没看,很多我自己还不认识呢 :(。
4、Literials,
A、首先是数字,Ruby总是以完全面向对象自居,因为相比Java的完全面向对象,它的数字也是对象,Java都发了这么多版本也才到装箱的水平,:P。所有Ruby中的数字都是继承自Fixnum、Bignum和Float类,这样所有的数字都是类的实例,它们都有一些共同的方法,如迭代。这里发现一个特别的数字,就是decimal with underline,不暂时不知道这个数字可以用来做点啥,还有用?a来表示'a',感觉这个方式倒是挺好的。其他的都和Java差不多哦,甚至还有Bignum的支持。
B、字符串,两种,"abc" allow substitution and backslash notation;'abc' don't allow substitution and allow backslash notation only for \\ and \',说是双引号字符串允许修改和增加斜杠来做字符转义,而单引号字符串不允许,字符转义这个区别我觉得很不错,但不知道这个允许修改是什么意思,难道单引号搞出来的东西就直接成常量了?不解……还有Ruby中"abc""efg",字符串连着写就直接成了"abcefg"不知道这个特性在实际应用中会有多少实惠。还有对表达式的支持,Java5中也提供了类似的支持,不过貌似Ruby的更强悍一些,毕竟是动态语言,随意就是牛。这个表达式的支持目前我看着还不那么明白,要等到实际操作的时候才知道它有多厉害。很多例子中都用到这个#$var #${var},说明这个东西很常用的。特殊字符有一些和Java很相似,照例现学现卖。
在字符部分还有General delimited strings和here documents,用限定符来显示特殊字符,这个部分还是要等待有其他人来帮忙解释。好像是可以像JavaScript里面一样实现动态调用方法一类的功能,动态预言就是好,省的像Java里面搞反射那么难于理解和以性能为代价。here documents 待议……
C、Symbols,A symbol is an object corresponding to an identifier or variable,
:foo # symbol for 'foo'
:$foo # symbol for variable '$foo'
没有实际应用,照例拷贝上来,感觉上有点像HQL的变量,具体功能要慢慢学起。
D、数组,Ruby数组是用[]的。也可以用%w(foo bar baz)这种修饰符的方法来创建数组,表示["foo", "bar", "baz"]。
E、Hashes,A hash is a collection of key-value pairs or a collection that is indexed by arbitrary types of objects, 用这种形式的键值对来表示类似Java HashMap的功能,不知道使用起来有没有Java Collection里面那么多说法。
A hash expression is a series of key=>value pairs between braces.
{key1 => val1, key2 => val2}
Ruby中还直接内置了正则表达式的支持,初看上去和JavaScript的差不多哦,不过好像又多了一些东西,这个也要慢慢研究咯。
F、Variables,Ruby中变量:$foo为全局变量,大家都别用,HOHO。@foo,instance variables,看了看说明还是没搞懂这个东西是来干啥用的,天分差……
@@foo class variables,和Java差不多哦,覆盖父类的类变量会产生警告,而且在使用类变量必要要初始化。foo,loacl variables,必须是小写字母或者"_"开头,使用范围:class,module(这个东西也是面生),def or do。
常量以大写字母开头,但是这个常量还是可以再次making an assignment,会产生警告而不是错误。
Pseudo-Variables,Ruby里面的假变量,包括self,true,false,nil,_FILE_,_LINE_,都是特定的东西,而且不允许用作变量。
在Ruby中赋值可以采用expr.attr这样的简写形式,Assignment to attributes calls the attr= method of the result of expr,需要试用才知道效果。
Elements take the following form:
expr[arg...]
Assignment to elements calls the []= method of the result of expr.这段也不大懂。
Parallel Assignment ,
target[, target...][, *target] = expr[, expr...][, *expr]
这个给数组赋值的方法也挺特殊的,可以简化不少工作,如果后面的比前面的少,那么少的部分就以nil来填补。
Ruby中也支持简短赋值,target op= exprThis is the abbreviated form of:
target = target op expr
是类似于C++中的写法,不过我C++也玩不转 :(。
=================================================================
总算是把Ror的初次相遇记录下来了,里面显然有很多错误,希望大家能不吝指正,也希望能和大家多多交流、互促进步。我会不断补充内容,特别是Ruby grammar部分还没有完成。