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、MySQLserver均以启动。
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一样有影响力了,就能够全世界的部署镜像server,那样俺下载就方便多了: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的话一个project会变成个啥样子;结尾没有分号作为换行标志,假设想分行写能够用+,-或者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 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部分还没有完毕。