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。 也就是說私有方法只能在當前對象的上下文中被調用。