天天看點

Ruby入門(3)——方法、代碼段

Ruby中的方法是一個有名稱的代碼塊,是與一個或多個對象關聯的參數化的代碼。調用時須給出方法名,接收者(所在對象),參數值,且最後一個表達式的值做為傳回值。與Ruby方法相似的是代碼塊,它沒有名字,且調用時隻通過疊代器或被間接調用。

(一)方法

(1)定義方法

定義方法就是

def 方法名(參數清單)

方法體

end

最後一個表達式做為傳回值傳回,如果有值,則傳回;無值則傳回nil。可以省略return。

在類中定義的方法為執行個體方法,執行個體方法可以在類的執行個體對象上使用。如果是在一個特定的對象上定義方法,那麼此方法就是一個單鍵方法,隻能在這個對象上使用。

class Test 

  def instance_method_test(v) 

    puts "#{v}: instance method" 

  end  

end 

t1=Test.new 

t2=Test.new 

t1.instance_method_test("t1") 

t2.instance_method_test("t2") 

def t1.singleton_method_test(v) 

  puts "#{v}:singleton method" 

t1.singleton_method_test("t1") 

#t2.singleton_method_test("t2") 

在ruby中,方法一般小寫字母開頭,如果超過一個單詞,則由下劃線隔開(看習慣)。有意思的是方法名可以以等号、問号、歎号結尾,且有不同的意義:以等号(=)結尾表示這是一個指派方法(寫屬性);以問号(?)結尾表示一個斷言方法,可以回答調用者提出問題的值,例如判斷大小;歎号(!)結尾表示是一個可變方法,可能會影響到對象的狀态,要小心使用。這三個符号很有意思,但它們不是必須的。

(2)取消方法

通過undef 方法名 可以取消方法。對于被繼承的方法,undef可以取消子類中的繼承來的方法,但不會取消父類中的此方法。

(3)方法參數

在參數中添加等号和值就可以為這一個參數設定預設值。如果參數有預設值,那麼在調用方法時,可以為這個參數指定值或不指定值。

def createRole(name,level=1) 

  puts "role name is#{:name} level is #{level}" 

createRole("way") 

createRole("clound",5) 

通過在參數前邊加星号(*),可以為方法指定為可變參數個數(數組參數),且指定的個數最多為一個。

def add_Person(*users) 

  puts users 

add_Person("a1","a2") 

add_Person("a1","a2","a3") 

如果要把數組傳遞給方法,要在數組前加星号(*)。

(二)代碼塊

方法調用後可以緊跟一個代碼塊,關聯代碼塊的方法可以通過yield來調用。

def showMessage(i) 

  yield i*2 

  print i 

showMessage(5){|x|print "#{x}"} 

代碼塊通過yield調用,也可以做為方法參數傳遞,但前提是這個參數前需要添加&做為字首且為最後一個參數。而此時它以一個proc對象傳遞,調用時不能通過yield調用,而是通過proc的call方法調用。另外,如果以顯示方式,即傳遞proc對象給方法,那方法定義的參數就不加&字首了。通過&字首,代碼塊可以與任何方法調用關聯起來,即使此方法沒有yield語句。任何方法調用都可以用&參數作為最後一個參數。所有支援to_proc的方法都能用&。

#傳遞代碼塊,代碼塊參數須為最後一個,且添加&字首;且調用時用proc的call方法 

def fun_block(i,&b) 

  b.call(i*2) 

fun_block(2){|x|puts x} 

#顯示傳遞proc對象。那麼方法中proc對象部分的參數不加&字首 

def fun_proc(i,b) 

p=Proc.new{|x|puts x} 

fun_proc(2,p) 

c=[1,2,3,4,5,6] 

b=c.select{|x|x%2==0} 

p1=Proc.new{|x|x%2==0} 

d=c.select(&p1) 

puts d

代碼塊是Ruby的一種句法結構,不是對象,但可以建立對象來表示一個代碼塊。根據對象的建立方式,分為proc或lambda。proc行為與代碼塊相似;lambda行為與方法相似,但它們都是Proc類的執行個體。

通過Proc.new建立一個proc,在1.9版本中,與proc方法為同義詞;通過lambda方法,建立一個lambda。lambda方法不帶參數,調用時段關聯一個代碼塊。

在ruby 1.9中,支援一種新的句法。将lambda換為->;将參數放到花括号外邊,小括号裡邊;花括号中隻保留表達式。(可以與.net3.*中的lambda比較:()=>{})

#1.8k中 

d1=lambda{|x|x+1} 

puts d1.call(5) 

#1.9中,将lambda換為->;參數放到花括号外邊,小括号裡邊;花括号中隻保留表達式 

#與.net3.*中的lambda表達式很像()=>{} 

d2=->(x){x+1} 

d2.call(5) 

這種新句法,使代碼簡潔,并使代碼段與ruby方法的統一,例如:設定參數預設值。

(三)閉包

ruby中的proc和lambda都是閉包(closure)。閉包表示一個對象既是一個可調用的函數,同時也是綁定在這個函數上的一個變量。從表面上解釋閉包就是:方法A内的方法B調用方法A的變量,并傳回結果。方法B就是閉包。它的作用:一是B方法的變量可以在方法外使用;二是A方法中的變量可以安全使用;三是對B方法中的值進行緩存。

(關于閉包,可以檢視相關文檔,我這裡隻是粗淺的認識。)

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請注明:部落格園

繼續閱讀