Ruby慣用法總結概覽
Ruby最近是一個比較熱門的詞匯,許多程序員都開始將目光轉向這項語言。它存在著許多慣用法,下面就向大家總結了一些Ruby慣用法,作為參考對象。#t#
迭代
一般寫法:
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__)一致時,也就是當前文件是被單獨執(zhí)行的而不是被別的文件調用。這個方法還有個用法是作為unit test使用。
預設變量和特殊記號
類似$0的Perl風格預設常量還有很多,參見Programming Ruby p319
其中比較常用的如$:代表庫搜索路徑,修改方法常見有: 代碼$:.unshift('buildscript') # from gigix 或 $: << File.join(File.dirname(__FILE__), 'CurrentClass')
后一種方法使用了相對路徑,因為Ruby的module不要求namespace和文件目錄結構要對應一致,很多時候統(tǒng)統(tǒng)放一個目錄里
%w格式化命令(from qiezi) 可以少打幾個引號
%w{a b c d} #
等價
['a', 'b', 'c', 'd']
``(~鍵下的撇號)用來執(zhí)行shell外部命令,如:
`help`
inject
一般寫法:
result = [] (1..10).each{|item| result << item}
習慣寫法:
(1..10).inject([]){|array, item| array << item}
inject有點難理解,相當于python的reduce和一些FP里的fold。inject的塊變量有兩個(這里是array和 item),第二個變量(item)用來枚舉被inject的集合(這里是(1..10)這個range), 而第一個變量(array)由inject的參數初始化(這里是[],可選),并在block被反復執(zhí)行時保持持久(相當于靜態(tài)變量),而item則在每 次枚舉時被更新為下一個值。
我們再看一下inject的另一種通常用法就會更明白了:
求和
(1..10).inject{|sum, item| sum += item}
這個等于
(1..10).inject(0){|sum, item| sum += item}
也就是塊變量sum被初始化成0然后反復迭代執(zhí)行塊的內容,最后返回sum,并行賦值 這個很多人都知道了,比如:
a,b = 0, 1 a,b = b, a #
交換
a,b
當然可以延伸出一些很詭異的變化,不提倡使用阿。
還有一個用法是讓函數返回“多個結果”(不是多個對象),如:
def test 1,2 end x, y = test #x = 1, y = 2
這個njmzhang說的很對,其實函數返回的是一個array,然后再并行匹配到變量上去。(所以我對多個結果特別加了引號) 這顯然是個syntax sugar,你隨便用逗號分割幾個變量是不會自動組成array的。
注意這種并行匹配當兩遍不平衡時會造成的問題:
a,b = [1,2,3] # a = 1, b = 2, 3
被丟棄
a,b,c = [1,2] # a = 1, b = 2, c = nil
被初始化成nil
*的匹配 一般來說*用于把一個array展開:
a, *b = [1,2,3] #a = 1, b = [2,3]
類似FP里的x:xs(haskell), x::xs(ocaml), [a | b] (erlang from 布娃娃)
rescue簡單用法
begin 1/0 rescue puts 'wrong' end
可以簡化為
1/0 rescue puts 'wrong'