Method
a) 定義:
def 方法名 (參數) #在ruby中方法的參數可以不加括弧
#do something
end
註:方法名命名規則:以小寫字母或者底線開始,後邊跟數字,字母和底線,單詞之間用下劃隔開:
def hello_world
puts “Hello world”
end
方法名後邊可以跟=, ?, !
“=”: 表示該對象的參數可選,若調用時,沒有參數,則使用預設的
“?”: 表示該方法是查詢功能的方法
“!”: 修改接收對象的方法
b) 方法參數:
1.設定方法參數預設值:在定義方法時,可以為一些或全部參數指定預設值。在參數後加下等號和一個值,就可以為該參數指定一個預設值,如:
def hello(name="ruby")
puts("Hello, #{name}")
end
hello()
hello("world")
另外,參數的預設值不一定必須是常量,也可以是任意運算式,還可以是執行個體變數的引用,還可以是前面定義參數的引用。
def hello(a=10,b=5,c=a-b)
puts a,b,c
end
hello()
puts
hello(1,2,10)
2.可變長度參數列表:Ruby中接受任意數目的參數,要在某個參數前加上一個*號,在方法的代碼中,這個參數表示成一個數組,它包含傳給這個位置上的0個或多個參數。比如:
def hello(first,*rest)
p first
p rest
end
hello("11","22","33","44","55")
註:在ruby1.9中,用*打頭的參數要放在帶有預設值參數的後面,其後可以再指定普通參數,但是該普通參數要放在&打頭的參數之前。
3.雜湊表作為有名參數:如果一個方法的有多於兩三個參數時,程式員很難記清楚參數的順序,這時我們就可以使用雜湊對像作為參數,如:
def sequence(args)
m=args[:m]
c=args[:c]
n=args[:n]
a=[]
3.times{|i| a << m*i + c}
p a #=> [10, 15, 20]
end
sequence({:n=>3, :m=>5,:c=>10}) #調用方法,傳遞雜湊對像
另外,如果雜湊對象是最後一個參數(或後面只有一個用&打頭的代碼塊參數),Ruby允許省略雜湊字面量的大括弧。
sequence(:n=>3, :m=>5,:c=>10)
因為Ruby中方法調用可以省略圓括弧,所以也可以寫成下面這樣的形式:
sequence :n=>3, :m=>5,:c=>10
如果省略了圓括弧,就必須省略大括弧,否遇Ruby認為你傳遞了一個代碼塊給這個方法。
4.代碼塊參數:在Ruby中每個方法調用都可以緊跟一個代碼塊,每個關聯代碼塊的方法可以通過yield語句調用代碼塊中的代碼。
def hello(n,m,c)
i=0
while(i<n)
yield i*m + c
i+=1
end
end
hello(3,2,1){|x| puts x}
代碼塊是匿名的,如果希望明確的來控制一個代碼塊,可以在方法最後加上一個參數,並用&做這個參數的首碼。這個參數會指向傳給方法的代碼塊,該參數是一個Proc對象,它不使用yield語句調用,而是直接通過Proc的call方法來調用:
def sequence(n,m,c,&b)
i=0
while(i<n)
b.call(i*m+c)
i+=1
end
end
sequence(5,2,2){|x|puts x}
或
def sequence(n,m,c,b)
i=0
while(i<n)
b.call(i*m+c)
i+=1
end
end
p=Proc.new{|x|puts x}
sequence(5,2,2,p)}
註:用&打頭的代碼塊參數必須是最後一個,這是為了與省略了括弧的數組與雜湊參數區別。
c) 傳回值
方法代碼的最後一個運算式的值會作為方法調用運算式的值返回。在Ruby中可使用return關鍵字顯式返回運算式的值,當然也可以不使用return關鍵字,隱式返回運算式的值。
Class
a) 定義
class name
def initialize (pram1, pram2, …)
@pram1 = pram1
@pram2 = pram2
…
end
…
end
Note: 類名的首字母大寫,後面的單詞的首字母也大寫;
Initialize 方法如果不做定義,系統預設有一個initialize 方法,在執行個體化變數時無需給其參數;若使用者自訂initialize方法後,執行個體化對象時就要按照該方法的格式執行個體化;
Ruby中在執行個體嵌套類時,需要需要使用”外部類::嵌套類.new”的格式執行個體化潛逃類。
b) 繼承
class SubCalss < SuperClass
...
end
c)訪問器方法和屬性
通俗版:
class Test
def initialize(x,y)
@x=x
@y=y
end
def x; @x;end
def y;@y; end
def x=(value)
@x=value
end
def y=(value)
@y=value
end
end
改進版:
class Test
attr_reader :x, :y
#attr_accessor
#attr_writer
end
d) 類方法
在ruby中可以使用類名稱直接存取的方法,稱為類方法。有三種方法可以定義一個類方法;
1)類名.方法名
2) self.方法名 #(使用self的目的之一是:DRY, don’t repeat yourself)
3)class << self
def 方法名
…
end
…
end
e) 類變數:
在Ruby中,還可以定義類變數,類變數需要以”@@”開頭,它屬於某個類,所以在類的某個執行個體改變類變數時,將引起執行個體所屬類的類變數發生改變。即一旦類變數發生改變,所有執行個體調用的類變數都會發生改變。類變數使用之前一定要初始化;
f) 存取控制
Public 可以被任何執行個體化對象調用,沒有限制訪問存取控制。方法預設是public,initialize除外,預設為private. 另外一個例外是所有在類外定義的”全域”方法,這些方法被定義為Object對象的私人執行個體方法
Protected 只能被定義了該方法類或其子類對象調用。整個家族均可訪問。
Private 不能對象直接調用,接收者只能是self。 也就是說私人方法只能在當前對象的上下文中被調用。