走近 Ruby 的世界(二)

还是零碎的记录,也不知道该为每一篇赋上什么合适的标题,姑且用一、二、三、四 ...... 往下标吧。

一种编程语 言,Coding 时一定要讲求效率的,我向来不认为用记事本来写程序就可被认为是多么的高明。就像测试 Java 程序我仍然是选用 Eclipse,当然命令行技术是要求掌握的。写 Ruby 程序可以用 NetBeans 那样带智能提示的工具,但是 Mac OS 下,TextMate 的口碑很不多的,它有很好用的 Bundle,Cmd+R 就能看到运行结果,查帮助也很方便。

从代码的智能提示来看,TextMate 或许只能称之为半智能,但它的效率还是非常的高,且基于其余时候打开 TextMate 的频度,我选择 TextMate 作为 Ruby 的 IDE。

Ruby 的表达式和操作符,Ruby 的语法是面向表达式的,如在其他语言中的控制结构在 Ruby 中统统叫做表达式,只是它们的返回值为 nil。来看几个较有特色的 Ruby 运算符:

执行的结果如下图,直接在 TextMate 中运行后的截屏:


许多的 Ruby 操作符就是由方法实现的,也就是说上面的运算符也就是方法调用,不信的话,你可以把上面的代码写成下面的形式:

即把第二个操作数当作符号方法调用的参数,得到的是同样的结果。

也就是因为操作符即为相应方法的调用,这说明了 Ruby 也支持操作符的重载,像 Groovy 和 Scala 一样只要重载操作符相对应的方法即重载了该操作符。这比 C++ 中的操作符重载要好理解的多。

有关于操作符的重载,比如,<< 符号对于数字类型是移位操作,你可以重载该它使得对于字符串,数组,流等是 append 的操作。再如像  [] 这个操作符,通常是下标操作,但你用来 [1,2,3] 来定义数组时,其实就重载了该操作符的意义。

Ruby 的方法,Ruby 定义方法是用 def ... end 关键字,这与 Groovy 和 Scala 是一样的,且最后一个表达式的值就是方法的返回值,这与许多语言是一致的。

上面定义的是全局方法,如果要定义类或模块的方法,只要加个类或模块的前缀即可,比如给核心的 Math 模块加个方法:

这引出了 Ruby 的一个关键特征:Ruby 的类和模块在运行时对于修改和扩展是开放的,它不需要像在 Groovy 中对现有类的修改或扩展要借助于 MetaClass 这样的东西。

Ruby 支持并行赋值,像下面那样的赋值写法:

如果是 x, y, z = [1,2],右值不够的话,z 就为 nil, 始果是 x, y = [1,2,3], 也不会报错的,只用到前两个元素,脚本语言容错性必须很强的。

看到 Ruby 的并行赋值,我就会想到在 Perl 中相应的特性,可以用标量列表来接收数组变量,达到并行赋值的效果,如 Perl 用这样的代码:

不光赋值语句可以并行的,而且方法可以同时多个值,实质就是返回一个数组:

前面讲过 Ruby 的符号操作是调用的方法,就连赋值操作也不例外,比如你的对象定义一个名为 x= 的方法,你就可以使用 o.x = (1) 达到与 o.x = 1 等同的效果

本文链接 https://yanbin.blog/close-to-ruby-world-2/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments