從Ruby女孩(18)一直到Ruby女孩(24)我們都聚焦在【The Ruby Programming Language】這本書的第七章『類別與模組』上:
類別與模組我們要先告一段落了,我們曾在上面這七天看過很多方法的定義,今天來研究一下方法在定義上有什麼規則需要注意!
方法的定義會使用def
關鍵字,def
後面空一格接方法的名稱,名稱旁接著( )
,( )
中可放入參數,後方再接著方法的內容,最後以end
關鍵字為結尾。要注意:
來看看範例:
def my_age(age)
"I'm #{age} years old!"
end
方法名稱:my_age 圓括號中的參數:age
my_age(20)
#當調用my_age方法時可以直接在後方加入引數,此引數將引入程式碼的相同名稱的變數位置!
=> "I'm 20 years old!"
所定義的方法如果能夠正常執行,會自動以方法的最後一個運算式來當作回傳值,例如:
def who_will_return
1+1
"Ruby"
"Linda"
end
who_will_return
=> "Linda"
在箭號右方的就是回傳值,"Linda"
是此方法的最後一行,因此會以此行作為回傳值。
在方法中若加入return
關鍵字,則是強制讓此方法直接跳到結尾,例如:
def who_will_return
1+1
return "Ruby"
"Linda"
end
who_will_return
=> "Ruby"
也可以在return
後方加入判斷式:
def who_will_return(n)
1+1
return if 1+n>=30
"Linda"
end
who_will_return(1)
=> "Linda"
who_will_return(100)
=> nil
方法的調用總是針對一個物件來進行,你可以注意到,我們前面在調用方法時,都會在某物件後面加上『.方法』,物件通常被稱為接收器,而方法稱為訊息,而Ruby都是使用『.』來分隔物件與方法。
今天的文章到目前為止所定義的方法都是全域性的方法,前幾天的文章也介紹過在類別裡面有所謂實體方法與類別方法,今天要再另一種替特定物件定義的方法,稱為單體方法(singleton method),它只能被使用在單一物件上,它的定義方式為:
aaa = "我愛Ruby"
def aaa.hello #替aaa物件定義一個單體方法
"Hello World!"
end
aaa.hello
=> "Hello World!"
bbb = "我愛Python"
=> "我愛Python"
bbb.hello
NoMethodError: undefined method `hello' for "我愛Python":String
可以注意到hello
這個方法是屬於aaa
的單體方法,所以bbb
是不能調用的!
有沒有發現這種定義方法跟什麼很像呢?我們在前面的文章中有提到類別中的類別方法,是這樣定義的:
class RubyGirl
def self.hello
end
end
或
class RubyGirl
def RubyGirl.hello
end
end
類別方法的定義方式跟單體方法很像,是的沒錯! 其實,類別方法就是單體方法!!!! 其實,類別方法就是單體方法!!!! 其實,類別方法就是單體方法!!!!
單體方法不是通用在所有物件上的,Numeric類別與Symbol值都不能使用!書中指出:
『Ruby將Fixnum與Symbol視為立即值,而非真正的物件參照,因此不適用單體方法』(p.185):
a = :rubyruby
def a.hello
"Hello World"
end
TypeError: can't define singleton
我們用def
定義一個方法,可以用undef
來解除方法的定義,例如:
def sum(x,y)
x+y
end
undef sum #解除sum這個方法
在類別的繼承關係中也可以使用,例如父類別的m方法繼承到了子類別,但子類別不想用到這個方法,就可以undef m,只是這種方式不常用,通常都是定義新的方法來使用,而非刪除舊的方法。
另外,def
可以定義單體方法,但undef
不能解除單體方法!
後面的章節還有提到『方法的名稱』、『方法與圓括號』與『方法的引數』,明日再來說明!
25天!
“Adventure may hurt you, but monotony will kill you.”
還有5天!沒想到也持續了25天了!繼續享受在Ruby中的adventure!