因工作需要,需用到 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 都是对象,它们有自己的属性和方法,你可以对它们点一下点出东西来。如:
1 2 3 4 |
puts 1.class #Fixnum puts 0.0.class #Float puts true.class #TrueClass puts nil.class #NilClass |
注意到,别以为上面是在引用对象的 class 属性,其实不然,是在调用相应的方法,只是把圆括号省去了而已。Ruby 在调用方法时通常会省去圆括号,特别是对于无参方法时。Ruby 是不允许从外部访问对象的内部状态的,必须通过访问方法的,这与 Objective-C 是一致的。所以上面的 puts 1.class 就是调用的 puts 1.class()。
块和迭代,看下面的代码即解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
2.times { print "Ruby!"}; puts #输出 Ruby!Ruby! 1.upto(9) {|x| print x} #输出 123456789 puts a = [3,2,1] a.each do |elt| #每个元素作为参数 elt 传入块中 print elt+1 #输出 432 end puts c = a.select {|x| x%2==0} puts c #输出 2 h = { :one => 1, :two => 2, } puts h[:one] #输出 1 h[:three]=3; h.each do |key, value| print "#{key}:#{value};" #输出 one:1;two:2;three:3 end |
说明:Ruby 是使用了类 Java/C 的语法,所以语句后也可以用分号来分隔,只是 Ruby 还支持用换行来分开两条语句。Ruby 中很多方法后可使用块(Block),看方法是怎么定义的,它和 Objective-C 的 Block 差不多,其实就是个闭包(Closure)。
块(Block) 的表示法既可以用{},也可以用 do ... end,所以上面代码中最前最后两个语句可以写成:
1 2 3 4 5 6 7 8 9 10 11 12 |
2.times do print "Ruby!" #输出 Ruby!Ruby! end #...... h = { :one => 1, :two => 2, :three => 3 } h.each {|key, value| print "#{key}:#{value};" #输出 one:1;two:2;three:3 } |
你是愿意写 {} 还是 do ... end,就看自己的习惯了。
很多时候,块中的语句根据调用者是什么会被迭代执行,譬如是数组,或哈稀的方法的块,看块是怎么定义的:
块可以带几个参数,块的参数用两个竖线框起来,逗号分隔多个参数。
和 PHP/Perl 一样,在双引号括起的字符串中间的像 #{value},会被解析出它的值来,再调用 to_s 方法插入到相应位置上,例如
puts "#{value}" 的执行效果就是 puts value.to_s;
块不仅是作为一个可复用的闭包方便使用,它还会给你处理好资源的释放和异常,如:
1 2 3 |
File.open("data.txt") do |f| line = f.readline end |
上面的代码在操作完后自动释放文件句柄,并且不用你显示的去处理 IO 异常,想像一下在操作数据库时有了这样的闭包多方便,所以 Groovy 也是充分发挥了这一特点的。
本文链接 https://yanbin.blog/close-to-ruby-world-1/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。