1. 快速获取正则表达式的匹配值
通常我们使用正则表达式,都是先match,然后再取结果,但是这样有时候会抛异常,看下面例子:
email = "Fred Bloggs "
email.match(//)[1] # => "fred@bloggs.com"
email[//, 1] # => "fred@bloggs.com"
email.match(/(x)/)[1] # => NoMethodError [:(]
email[/(x)/, 1] # => nil
email[/([bcd]).*?([fgh])/, 2] # => "g"
</div>
上面例子中还有一种更简单的方法,就是使用 String#[]方法,可以直接匹配正则表达式,更简洁,虽然看起来使用了魔鬼数字。
当然你可以省略掉那个魔鬼数字,如果仅匹配一次的话:
x = 'this is a test'
x[/[aeiou].+?[aeiou]/] # => 'is i'
</div>
这个例子中,我们匹配规则“先匹配一个元音,然后一个辅音,再接着一个元音”。
2. Array#join!的快捷实现
我们知道Array的*操作,是将数组里面的元素成倍的增加:
[1, 2, 3] * 3 == [1, 2, 3, 1, 2, 3, 1, 2, 3]
</div>
但是当乘因子不是数字是字符串会出现什么效果?
%w{this is a test} * ", " # => "this, is, a, test"
h = { :name => "Fred", :age => 77 }
h.map { |i| i * "=" } * "n" # => "age=77nname=Fred"
</div>
对了,这就是join!的效果。因此可以用这种方式来快捷地实现join!操作。
3. 快速格式化十进制数字
格式化浮点数字的精度显示通常使用sprintf这个函数,可是有一种更快捷的方式,使用字符串。
money = 9.5
"%.2f" % money # => "9.50"
</div>
4. 快速解析字符串
在技巧3中我们看到了数字的格式化,这里就说一下字符串格式的快捷方式。
"[%s]" % "same old drag" # => "[same old drag]"
</div>
这里的意思是将”same old drag”显示到[]中。
我们再看一下具体的格式化方法:
x = %w{p hello p}
"%s" % x # => "
hello
”</div>
5. 递归删除文件和目录
FileUtils提供了这种方法:
require 'fileutils'
FileUtils.rm_r 'somedir'
</div>
还有一个方法是FileUtils.rm_rf,与linux上的 rm -rf 对应。
6. 快速穷举可枚举对象
使用*操作可以快速的穷举出可枚举对象中的所有元素,像Array,Hash这种对象。
a = %w{a b}
b = %w{c d}
[a + b] # => [["a", "b", "c", "d"]]
[*a + b] # => ["a", "b", "c", "d"]
</div>
这里*操作符的优先级低于+操作符。
a = { :name => "Fred", :age => 93 }
[a] # => [{:name => "Fred", :age =>93}]
[*a] # => [[:name, "Fred"], [:age, 93]]
a = %w{a b c d e f g h}
b = [0, 5, 6]
a.values_at(*b).inspect # => ["a", "f", "g"]
</div>
7. 消除临时变量
我们有时候需要写一个临时变量如一个临时的Array,有一种方式可以不用单独定义临时变量:
(z ||= []) << 'test'
</div>
当然这不是一种很好的编程习惯,建议不要大量在代码中使用。
8. 使用非字符串或非Symbol对象作为Hash的Key
或许你从来没有尝试过使用非String或非Symbol对象作为Hash的Key,但是确实是可以的,有时候还蛮有用。
does = is = { true => 'Yes', false => 'No' }
does[10 == 50] # => "No"
is[10 > 5] # => "Yes"
</div>
9. 使用and或or将多个操作组合到一行
这个技巧很多熟练的Ruby程序员都会使用,用来替代if和unless这种短行代码。
queue = []
%w{hello x world}.each do |word|
queue << word and puts "Added to queue" unless word.length < 2
end
puts queue.inspect
# Output:
# Added to queue
# Added to queue
# ["hello", "world"]
</div>
但是注意,这种方式,若and左边表达式“queue << word”返回nil则“puts "Added to queue"”不会被执行,

