走近 Ruby 的世界(一)

因工作需要,需用到 Ruby 来写 BDD(Behaviour Driven Development) 的脚本,这样的话还是希望自己对 Ruby 有一定程度的了解,不能总是依葫芦画瓢吧。


Ruby 是由松本行弘(Yukihiro Matsumoto, 简称:Matz) 发明的,确实应该佩服一下,不存在什么民族情节的,比起所谓的汉语编程要强上千百遍,再说,通常民族情节都为政治所利用的。蒙牛、百度,腾讯等等 ,民族品牌,狗屁,都是某些个岛国注册的。

Ruby is designed to make programmers happy. Ruby 吸收了 List、Smalltalk 和 Perl 的灵感,采用了类似于 C 和 Java 的语法。

Ruby 是完全面向对象的编程语言(completely object-oriented language),不像 Java 和 C 存在基本(原始)类型,在 Ruby 的世界里,什么都是对象,像数字,true、false 或  nil 都是对象,它们有自己的属性和方法,你可以对它们点一下点出东西来。如:
1puts 1.class     #Fixnum
2puts 0.0.class   #Float
3puts true.class  #TrueClass
4puts nil.class   #NilClass

注意到,别以为上面是在引用对象的 class 属性,其实不然,是在调用相应的方法,只是把圆括号省去了而已。Ruby 在调用方法时通常会省去圆括号,特别是对于无参方法时。Ruby 是不允许从外部访问对象的内部状态的,必须通过访问方法的,这与 Objective-C 是一致的。所以上面的 puts 1.class 就是调用的 puts 1.class()。

块和迭代,看下面的代码即解释:
 12.times { print "Ruby!"}; puts  #输出 Ruby!Ruby!
 21.upto(9) {|x| print x}         #输出 123456789
 3puts
 4
 5a = [3,2,1]
 6a.each do |elt|                 #每个元素作为参数 elt 传入块中
 7  print elt+1                   #输出 432
 8end  
 9puts
10
11c = a.select {|x| x%2==0}       
12puts c                          #输出 2
13
14h = {
15  :one => 1,
16  :two => 2,
17}         
18puts h[:one]                   #输出 1
19h[:three]=3;
20h.each do |key, value|
21  print "#{key}:#{value};"    #输出 one:1;two:2;three:3
22end

说明:Ruby 是使用了类 Java/C 的语法,所以语句后也可以用分号来分隔,只是 Ruby 还支持用换行来分开两条语句。Ruby 中很多方法后可使用块(Block),看方法是怎么定义的,它和 Objective-C 的 Block 差不多,其实就是个闭包(Closure)。

块(Block) 的表示法既可以用{},也可以用 do ... end,所以上面代码中最前最后两个语句可以写成:
 12.times do
 2  print "Ruby!"             #输出 Ruby!Ruby!
 3end
 4#......
 5h = {
 6  :one => 1,
 7  :two => 2,
 8  :three => 3
 9}
10h.each {|key, value|
11  print "#{key}:#{value};"  #输出 one:1;two:2;three:3
12} 

你是愿意写 {} 还是 do ... end,就看自己的习惯了。

很多时候,块中的语句根据调用者是什么会被迭代执行,譬如是数组,或哈稀的方法的块,看块是怎么定义的:


块可以带几个参数,块的参数用两个竖线框起来,逗号分隔多个参数

和 PHP/Perl 一样,在双引号括起的字符串中间的像 #{value},会被解析出它的值来,再调用 to_s 方法插入到相应位置上,例如

puts "#{value}"   的执行效果就是    puts value.to_s;

块不仅是作为一个可复用的闭包方便使用,它还会给你处理好资源的释放和异常,如:
1File.open("data.txt") do |f|
2  line = f.readline
3end

上面的代码在操作完后自动释放文件句柄,并且不用你显示的去处理 IO 异常,想像一下在操作数据库时有了这样的闭包多方便,所以 Groovy 也是充分发挥了这一特点的。 永久链接 https://yanbin.blog/close-to-ruby-world-1/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。