Straybird’s Blog

A blog for life and study

Ruby,就是这么任性(1)

由于工作需求,最近开始学习ruby了,其实前段时间也学过一些,但因为久未用之,再捡起来发现已经是忘得差不多了。而且由于之前学习的时候只是在机械的学习一些语法,对这门语言并没有多么深刻的领悟,这次学习的时候心态就不一样了。

ruby的哲学

说哲学,也许太过大了一点,但在ruby的世界观,任何问题都没有唯一的解决方案,其身上处处透露着不羁。正如最近看到的将语言比作国家的笑话中,ruby被比喻为“法国,以为自己很厉害,但其实没人鸟”,颇有点自命清高的意思。但随着近几年ruby on rails的火爆,ruby也算是翻身了,但硬伤还在,那就是在大型项目的性能一直有待考证,以及太过自由的语法给团队协作也带来了困难。相对而言,python则表现更加优良,其一个问题,一个解决方案的哲学更加适合于团队之间的协作。

自由的语法

这次重新接触ruby,是从公司YES框架开始的。一开始遇到了好多坑,也咒骂这门语言,太灵活,太动态,但慢慢学习下去才知道其带来的好处。当然我也不认为有些自由的语法是多么的必要,但对于ruby工程师而言,这些也许就是这门语言吸引他们的一部分原因。

  • ruby的每一行代码不需要以分号结束,会自动判断。一行写不完的情况下,而且结尾处是操作符等可以被判断出来的,那不需要特殊处理,直接第二行接着写就可以了;如果结尾处不好判断,则加上\即可。
  • 方法调用既可以加括号,也可以不加括号。这是把我坑的很惨的一个语法,有时候都不是很好分辨是方法调用还是参数定义。个人感觉,方法带参数的时候还是加括号吧。
  • 如果说ruby一直是灵活的自由的,那这一个也许就是其唯一的不灵活不自由吧,在ruby总,局部变量要以小写字母或下划线开头,全局变量以$开头,实例变量以@开头,类变量以@@开头,常量和类/模块名以大写字母开头。其中类变量使用前必须被初始化。
  • 写属性方法的定义是以属性=(值)的方式的,这是我见过的第一门这么定义的语言,以=结尾的确是相当直观。其实只要定义以=结尾的函数,就可以将其用于表达式的左侧。
  • 类方法的定义有三种方法,self.方法名,类名.方法名,class <<self然后再定义。这很好地体现了ruby的哲学。
  • 每个函数都有返回值,如果没有显式的定义,那就是函数最后一行执行的结果。其实不仅仅是函数,在ruby中,表达式也是有返回值,比如if等,它们的返回也是最后一行执行的结果。这颇有种给表达式赋予了生命的感觉。
  • 数组的访问中不用担心越界,越界直接返回nil,越界赋值则直接中间的全部赋为nil。负数下标表示从后往前的顺序,这一点我个人觉得很人性,也很方便。还可以通过range来访问,其中..表示包含尾,…表示不包含尾。
  • 除了=以外,?和!也可以作为函数定义的后缀,其中?表示这是查询函数,!则表示会修改对象本身,谨慎使用。
  • 在ruby中,如果想要一个行参接受多个参数,那太容易了,只需要加上*就可以了
  • block的两种方式有两种,{}以及 do…end,其中后者优先级低于前者。block可以直接跟在函数后面,在函数中通过yield就可以调用到block。block在ruby中很关键也很强大。

关于ruby,我也还在学习中,所以很多地方的见解不见得对。这个系列我会接着写下去,因为ruby这门语言的确有很多可圈可点的地方,我就边学边总结吧。预计后面会写无处不在的block,模块与mixin,强大的动态性,ducking type等,当然也会继续总结语法。第一篇就暂时到这里了,真实情况是肚子里没货了,赶紧学习去了!

Comments