Ruby 有不少惯用法,这里略作一些介绍,也方便阅读他人代码:
迭代 一般写法:
for i in (1..10)
puts i
end
习惯写法:
(1..10).each{|i| puts i}
或
1.upto(10){|i| puts i} # from njmzhang
||=赋值 一般写法:
number = 1 if number.nil?
number = 1 unless number
习惯写法:
number ||= 1
程序入口
if __FILE__ == $0
或
if $PROGRAM_NAME == __FILE__
这个相当于 main(), 逻辑判断的意思当程序名 ($0或另一个)和当前文件名 (FILE) 一致时,也就是当前文件是被单独执行的而不是被别的文件调用。这个方法还有个用法是作为 unit test 使用。
预设变量和特殊记号 其中比较常用的如$:代表库搜索路径,修改方法常见有:
$:.unshift('buildscript') # from gigix
或
$: << File.join(File.dirname(__FILE__), 'CurrentClass')
后一种方法使用了相对路径,因为 Ruby 的 module 不要求 namespace 和文件目录结构要对应一致,很多时候统统放一个目录里. %w格式化命令 (from qiezi) 可以少打几个引号
%w{a b c d} #等价 ['a', 'b', 'c', 'd']
(~键下的撇号)用来执行shell外部命令,如:
help
``
inject 一般写法:
result = []
(1..10).each{|item| result << item}
习惯写法:(1..10).inject([]){|array, item| array << item}
nject 的块变量有两个(这里是 array 和 item),第二个变量 (item) 用来枚举被 inject 的集合(这里是 (1..10) 这个 range), 而第一个变量 (array) 由 inject 的参数初始化 (这里是 [],可选),并在 block 被反复执行时保持持久(相当于静态变量),而 item 则在每次枚举时被更新为下一个值。我们再看一下 inject 的另一种通常用法就会更明白了:求和
(1..10).inject{|sum, item| sum += item}
这个等于
(1..10).inject(0){|sum, item| sum += item}
并行赋值
a,b = 0, 1
a,b = b, a # 交换a,b
还有一个用法是让函数返回“多个结果”(不是多个对象),其实函数返回的是一个 array,然后再并行匹配到变量上去 如:
def test
1,2
end
x, y = test #x = 1, y = 2
注意这种并行匹配当两遍不平衡时会造成的问题:
a,b = [1,2,3] # a = 1, b = 2, 3被丢弃
a,b,c = [1,2] # a = 1, b = 2, c = nil 被初始化成nil
符号转换到 Proc :
一般写法:(1..10).map{|item| item.succ}
习惯写法:
(1..10).map(&:succ)
注意这是 Rails 特有的,通过 ActiveSupport 对 Symbol 插入 to_proc 方法。