iT邦幫忙

DAY 25
0

Ruby女孩:10萬.times { puts "為什麼?" }系列 第 25

Ruby女孩(25):來認識方法的定義與解除!

  • 分享至 

  • xImage
  •  

從Ruby女孩(18)一直到Ruby女孩(24)我們都聚焦在**【The Ruby Programming Language】這本書的第七章『類別與模組』**上:
Ruby女孩(18) => 定義簡單的類別
Ruby女孩(19) => 說明getter、setter與accessor method
Ruby女孩(20) => 說明實體方法與類別方法的差異
Ruby女孩(21) => 說明類別變數與類別實體變數的差異
Ruby女孩(22) => 說明public、protected與private方法的差異
Ruby女孩(23) => 說明類別的繼承關係與子類別覆蓋方法方式
Ruby女孩(24) => 說明模組與類別的差異與mixin作用

類別與模組我們要先告一段落了,我們曾在上面這七天看過很多方法的定義,今天來研究一下方法在定義上有什麼規則需要注意!

※ 定義簡單的方法

方法的定義會使用**def**關鍵字,def後面空一格接方法的名稱,名稱旁接著圓括號,圓括號中可放入參數,後方再接著方法的內容,最後以end關鍵字為結尾。要注意:

1. 方法的名稱有規定寫法,待下方再做解釋
2. 圓括號通常可省略,但也有不可省略之時,也是待下方再做解釋
3. 圓括號中的參數,可直接作為方法程式碼中的變數(參數所提供的值,為調用方法時所給的引數)

來看看範例:

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)

今天的文章到目前為止所定義的方法都是全域性的方法,前幾天的文章也介紹過在類別裡面有所謂實體方法與類別方法,今天要再另一種替特定物件定義的方法,稱為單體方法(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!


上一篇
Ruby女孩(24):模組是不生孩子的!模組與類別差異及mixin介紹
下一篇
Ruby女孩(26):別鬧了,方法的圓括號別亂省!
系列文
Ruby女孩:10萬.times { puts "為什麼?" }30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言