还是零碎的记录,也不知道该为每一篇赋上什么合适的标题,姑且用一、二、三、四 ...... 往下标吧。
一种编程语 言,Coding 时一定要讲求效率的,我向来不认为用记事本来写程序就可被认为是多么的高明。就像测试 Java 程序我仍然是选用 Eclipse,当然命令行技术是要求掌握的。写 Ruby 程序可以用 NetBeans 那样带智能提示的工具,但是 Mac OS 下,TextMate 的口碑很不多的,它有很好用的 Bundle,Cmd+R 就能看到运行结果,查帮助也很方便。
从代码的智能提示来看,TextMate 或许只能称之为半智能,但它的效率还是非常的高,且基于其余时候打开 TextMate 的频度,我选择 TextMate 作为 Ruby 的 IDE。
Ruby 的表达式和操作符,Ruby 的语法是面向表达式的,如在其他语言中的控制结构在 Ruby 中统统叫做表达式,只是它们的返回值为 nil。来看几个较有特色的 Ruby 运算符:
1 2 3 4 |
puts 2**1024 #Ruby 支持很大很大的整数,不会那么容易出现放不下的问题 puts "Ruby" + " rocks!" #连接字符串 puts "Ruby! " * 3 #字符串成以数字就是重复几遍 puts "%d %s" % [3, "rubies"] #格式化字符串更直白,就是字符串的百分号操作符,参数为数组 |
执行的结果如下图,直接在 TextMate 中运行后的截屏:
许多的 Ruby 操作符就是由方法实现的,也就是说上面的运算符也就是方法调用,不信的话,你可以把上面的代码写成下面的形式:
1 2 3 4 |
puts 2**(1024) puts "Ruby" + (" rocks!") puts "Ruby! " * (3) puts "%d %s" % ([3, "rubies"]) |
即把第二个操作数当作符号方法调用的参数,得到的是同样的结果。
也就是因为操作符即为相应方法的调用,这说明了 Ruby 也支持操作符的重载,像 Groovy 和 Scala 一样只要重载操作符相对应的方法即重载了该操作符。这比 C++ 中的操作符重载要好理解的多。
有关于操作符的重载,比如,<< 符号对于数字类型是移位操作,你可以重载该它使得对于字符串,数组,流等是 append 的操作。再如像 [] 这个操作符,通常是下标操作,但你用来 [1,2,3] 来定义数组时,其实就重载了该操作符的意义。
Ruby 的方法,Ruby 定义方法是用 def ... end 关键字,这与 Groovy 和 Scala 是一样的,且最后一个表达式的值就是方法的返回值,这与许多语言是一致的。
1 2 3 |
def square(x) x*x #x*x的值即为该方法的返回值,当然,你也可以显式的用 return x*x 来返回,Ruby 中显得画蛇添足了 end |
上面定义的是全局方法,如果要定义类或模块的方法,只要加个类或模块的前缀即可,比如给核心的 Math 模块加个方法:
1 2 3 |
def Math.square(x) x*x #x*x的值即为该方法的返回值,当然,你也可以显式的用 return x*x 来返回,Ruby 中显得画蛇添足了 end #但如果是要在方法的中断直接返回而中断方法的继续执行时,就要用 return 语句了 |
这引出了 Ruby 的一个关键特征:Ruby 的类和模块在运行时对于修改和扩展是开放的,它不需要像在 Groovy 中对现有类的修改或扩展要借助于 MetaClass 这样的东西。
Ruby 支持并行赋值,像下面那样的赋值写法:
1 2 3 |
x, y = 1, 2 #意为 x=1; y=2 a, b = b, a #这样实现了交换 a 和 b 的值 x, y, z = [1,2,3] #数组中的元素分别赋值给 x、y 和 z, |
如果是 x, y, z = [1,2],右值不够的话,z 就为 nil, 始果是 x, y = [1,2,3], 也不会报错的,只用到前两个元素,脚本语言容错性必须很强的。
看到 Ruby 的并行赋值,我就会想到在 Perl 中相应的特性,可以用标量列表来接收数组变量,达到并行赋值的效果,如 Perl 用这样的代码:
1 2 |
@list = ("dog", "cat", "bird", "snake"); ($animal1, $animal2, $animal3, $animal4) = @list; |
不光赋值语句可以并行的,而且方法可以同时多个值,实质就是返回一个数组:
1 2 3 4 5 6 7 8 |
def polar(x, y) theta = Math.atan2(y, x) r = Math.hypot(x, y) [r, theta] end distance, angle = polar(2, 2) #调用该方法直接赋值给多个变量,用不着分几步 #tmp=polar(2,2), 再 distance = tmp[0]; angle = tmp[1] |
前面讲过 Ruby 的符号操作是调用的方法,就连赋值操作也不例外,比如你的对象定义一个名为 x= 的方法,你就可以使用 o.x = (1) 达到与 o.x = 1 等同的效果。
本文链接 https://yanbin.blog/close-to-ruby-world-2/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。