导言
最近我学习了令人激动的Ruby on Rails框架,发现了ruby语言。尽管我不认为自己是一个Ruby方面的专家,我阅读了PickAxe。也已经编写了个人使用Ruby小例子,现在业余时间我正在开发Rails。Ruby是我当前的编程语言的选择。在我高中的时候我学习了Turbo psacal语言(和我一样),大学的时候学习了C和C++语言。在我的毕业设计中使用了Java语言,因为希望如何才能使得开发网站变的更加快速以及简易,我从头开始学习了PHP,我有时候怀疑自己是被迫去编写代码,比其他更多的是一种娱乐的形式。对我所试过的语言方式相当的不满意,所以我下定决心去学习Pyhon或Ruby。最后我选择后者是因为我不希望不正确的缩排去破坏我的代码,同时我也赞美这种语言。
这里有大量的入门介绍,指南,文章,各式各样的评论,能指引初学者并建议高手如何学得Ruby的精髓,但这篇文章并不是指这些.
这更多的是一个谦虚,谦卑,且未完成列表的几个原因。这些原因或许(也或许不会)诱使你去使用Ruby或至少用一点,有一句格言是:如果你使用另一种编程语言来工作或其他什么的,请不要向我抱怨你不想再用它了-这的确发生在我身上,但是幸运的是,这没有关系,Ruby一个优雅和绅士的语言,但像所有的东西那样,它很可能毒害你的心灵和魂魄…
你已经被警告了:
为什么要学习Ruby
#1-你不需要经过门窍获得了款待。
Ruby借鉴了所有优秀的编程语言,从smalltalk到Java,Perl到Python。主要的是,下面的是Ruby给你的你曾在很多语言中看到过特点和功能:
.异常:不管你相信与否,异常对开发任何一个程序的人来说是最重要的特性之一。PHP4程序员也许根本不了解它,他们会告诉你仅仅打印到屏幕上或使用“极度高级”的类来处理错误。那么请忽视以上这些。对我们来说非常幸运,Ruby也包含了try/catch块(更好的方法是:begin/rescue)和一系列的预处理,扩展性的异常来处理错误。
.命名空间:Ruby模块使用优秀和易用的命名空间,满足Java和C++狂热者的喜悦。
.内置的正则表达式:在Perl中,你可以在斜线中插入一些内容成为正则表达式,与=~操作符相匹配.
. 重载的操作符:Ruby允许你定义像+,-等操作符重载.
.包: 所谓的”gems”,固定而又精确!包支持独立性,它们同样既可以跨平台也可以平台依赖.
.可交互的shell:交互式Ruby shell能立即测试Ruby代码.这与Python控制台相似.
.单元测试:Test::Unit使得一切换的非常容易,你没有任何借口不测试你的代码。
#2 你会喜欢上这个小东西
Ruby是优雅的,因为它不是为了可读性和可用性而把关注点放在代码简洁上.下面的一些提示会帮助你:
.你可以在条件语句中同时使用if和unless,当然你也可以只使用if和否定条件,但是在同时unless可以很少出错.再者,你可以使用这两个操作符做为条件修饰符,在一段语句之后而不是之后,order.new unless order.exists
.你可以在方法的末尾使用问题标记和声明标记.虽然不是约定执行的,?被添加在那些返回true或false值的方法.而!被用于标记方法被迫执行某些东西.就比如删除数据库记录,剪切掉字符串的最后一个字符等情况.
.你可以使用别名来为已定义的方法创建别名,这样在不增加成本和重复下,你可以有一个存在,而且只存在一个方法名.
.你可以使用attr_reader,attr_writer,或attr_accessor为指定的类成员自动生成get和set方法.
.一些命名规则可以由自己来约束:常量,类和模块是大写的,方法和成员变量必须以小写字母开头,全局变量以$开头,实例变量是以@开头,类变量是以@@开头.
.在方法调用中,圆括号是可选的,因此你可以把File.open(”/home/h3rald/test.txt”)简单的写成File.open ”/home/h3rald/test.txt”,这对于无参数的方法是非常便利的.
#3你将不会重复使用分号
你希望增加另一条指令?那就另起一行,在Ruby,就像Python,换行符问题, 你不需要去记得用分号结束你的指令.不幸的是,这意味着像C++那样你不能将一个完整的程序写在单一的代码行中…那样太不幸了,不是吗?
更新:你可以使用分号作为句子间的分隔符,但你也可以不用。
#4任何东西都是对象
在我学习Java的时候它们告诉我任何东西都是一个对象
“那么14 and 374346.678 是对象吗?” - “不,它们是数字”
在Ruby中,数字,字符串,Boolean值都是对象,这意味着你可以像下面一样写代码:
-12.abs #=> outputs 12
用PHP语言代替的话:
# PHP Code
strtolower(“YOU SHOULD’T ALWAYS USE CAPITALS”)
abs(-12)
相比之下你节约了时间,你也节约了括号,这样做更明智!
#5所有的都有值
一般你都很少使用return来返回一个值,简单的说,所有的Ruby指令都返回一个值,甚至是变量赋值,所以你不需要使用return关键字在方法末端来返回值,最后一个语句的值或其他任何表达式都会被返回.
#6你可以以你喜欢的方式更改环境
我第一次见到这种情况,真是吓坏我了,想象一个典型的编程环境:你使用一个系统类或其他人写的类,你会注意到你会加上一些额外的方法.在普通的编程语言中这点上有一些方法可以处理:
.你有权访问并修改了开发者的源代码,这不是好主意,你不应该这样做.
.你从前一个类派生了一个新类,并实现了新的方法.这非常好,但对一个方法有过度的作用,也许你需要更新相关的其他源代码.
.你放弃了这种方法,然后在类外创建了该方法,这可行,但这与面向对象编程有些格格不入.
在Ruby中,你可以简单的为类增加新的方法,并不需要更改先前的源代码,这条规律甚至可以适用于系统类!你希望有个能自动将米(meter)单位装换为英尺(feet)的方法?你可以简单的继承Numeric类,如下所示:
class Numeric
def feet
self*3.2808399
end
end
从现在开始,你所有的number都有一个feet方法,可以像number的预定义的方法使用。
5.feet #=> Returns 16.4041995
一般来说,Ruby类不永远被关闭,可以在任何时间任何地方被修改。
#7 你不会从鸟和马中得到独角兽,但你可以得到驴子
我依然清楚地记得大学时的C++教授用动物来举例面向对象和继承的概念,当她去解释继承自鸟类和马类的飞马类时,出现了难以解释的局面,它有一个像”fly”和”neigh”的方法。这是一个疯狂的事情,无论如何,Ruby不支持多重继承,这似乎是趋势,毕竟,这当然是最高的品味。我并不喜欢多重继承,因为它们会导致不可预测的错误。不过,用Ruby模块创建”mix-ins”还是可能的,所以定义在模块中的成员和函数会被添加到包含在该模块中的特定的类。
#8你不需要XML
XML是一个优美,多用途的标记语言,能够在各种场所为各种语言所使用。但不幸的是,XML写起来也是非常的冗长,难以解析,真实的说,咋看之下许多地方不具有良好的可读性,不像下面的代码:
regexp: !ruby/regexp /a-ZA-Z/
number: 4.7
string: a string
这比XML更简易以及具有更好的可读性,不是吗?欢迎来到YAML, Ruby流行的标记语言(并不真是),它可以简单,清晰,完整地方式的代表Ruby中所有的对象,Ruby能解析XML语言,但是YAML的 简单性征服了开发者使用它来作为XML配置文件的替代。例如(Rails就是其中的使用者)。如果一个方法定义在了Ruby的Object类中,那么Ruby中所与其他类都具有该方法。这意味着你可以把任何东西转换成YAML并由YAML转换回到Ruby对象,这对开发者都是透明的,Ruby就是那么解析的。
#9Lambda不仅仅是一个希腊字母
在Proc对象和块中,Ruby从Lisp和Perl语言借鉴了一些魔力,Procs是一些与局部变量相绑定的代码块。一旦绑定,代码可能会在其他内容中被调用但你依然能访问这些局部变量。考虑下面的代码:
def gen_times(factor)
return Proc.new{|n| n*factor}
end
times3 = gen_times(3)
times5 = gen_times(5)
times3.call(12) #=> 36
times5.call(5) #=>25
times3.call(times5.call(4)) #=>60
我曾经使用过lambda关键字来代替Proc.new,获得了一样的结果。这应该为了解Perl和Python语言的人敲警钟。你也可以在PHP中使用同样的方法,但大部分人不会使用这个方法。
另外补充一点,Ruby广泛使用块(block)
#10 你可以开始尝试Rails了
最后但并非最不重要,你可以开始使用Ruby on Rails来开发web程序。它的部署没有PHP那么简单,但是Rails构建在Ruby中,因为Ruby有其他语言无法提供的特征。
结论:
时间不等人,你也许已经决定了学习Ruby语言,你也许已经随便尝试一下Ruby,或者你完全忽视它。但下一次你会因为你的代码看起来丑陋且你看到了可以只用一半的代码做你现在的东西而觉的失败,不要责怪我。