[Day08] 想要變強就要不斷修煉,這是唯一的方法!
啊啦啦標題不小心用了火影梗,常常聽別人說,做事情要用對方法,這件事在 Ruby 的世界裡也是一樣的!
所以說,方法係啥?為什麼要使用方法?程式語言裡的方法是什麼?
什麼是方法?
正常來說,我們不會想把所有的程式碼寫在同一個檔案裡。而且如果是在開發專案,隨著複雜度提升,不同的程式通常會依照功能和類別(也可能只是按英文字母的順序)排列,分佈在專案裡的不同位置。
不過,由於不同的位置也會需要用到共同的程式碼,為了避免重複 coding,這時候就會透過 方法(method) 來解決這個問題,如果是學過 Javascript 函式(function)的朋友們,應該可以很快知道我在說什麼,它與 Ruby 的方法實際上是非常接近的東西。
為什麼要使用方法
- 可一直重複使用
- 讓程式碼更容易理解
先來看看在 Ruby 如何定義一個方法:
1 | def method_name |
每個方法都會被賦予一個名稱,會使用 def
和 end
兩個單詞來定義方法,而夾在中間的部分則是要請這個方法做的事情。
一旦定義了一個方法以後,就可以開始使喚它做事…(誤)
無論何時何地,取名字都要小心謹慎!
當 變數
和 方法
的名稱如果相同時,同名的 變數
會蓋掉同名的 方法
,需要特別留意!所以在命名方法時,請花點時間好好思考,取個獨一無二又能看出在做什麼的名字吧!
參數與引數
剛剛已經介紹了如何定義方法,不過在定義方法時,還可以設定這個方法需要哪些**參數(parameter)**:
1 | def walk(place) |
由於我們設定 walk
需要一個參數 place
,所以在呼叫 walk
時,也必須要剛好給一個**引數(argument)**,多了或少了都不行,在 Ruby 的世界裡,只要引數和參數的數量不同,方法就無法順利執行。
重新整理一下:
- 參數:定義方法使用要帶入的東西,類似規格的概念。
- 引數:呼叫方法時帶入的東西,引數的數量必須與定義方法時相同。
接下來,我們來呼叫看看這個 walk
方法!
方法!我呼叫你!
呼叫(invoke)方法的意思其實就是使用這個方法,算是技術圈的術語之一吧,總覺得有一種召喚某某方法來幫自己完成一件事的感覺。另外,也有看過其他大大稱為「調用」,只是我更習慣把它稱為「呼叫」。
要執行已經定義的方法的方式很簡單,只要直接呼叫方法的名字即可:
1 | walk("公園") |
甚至省略了 (
)
也可以,這是 Ruby 獨有的祕技!
1 | walk"公園" |
事實上,方法還可以被物件(object)所呼叫,不過那部分就等介紹到類別與物件的時候再一起說明吧!
請放心呼叫方法吧!
比起 Javascript 在呼叫函式時一定要有 ()
,Ruby 是不是厲害許多呢!(不小心就引戰了)不過,前提是要記得自己定義過哪些方法…
你的名字是?あなたのお名前は?
方法的參數也可以有預設值
在定義方法的時候,我們可以先給參數一個預設值,這麼一來,如果在呼叫方法時沒有給引數,方法會以預設值去執行,假裝自己有拿到引數
1 | def valentine(gift = "chocolate") |
突然想到有一年情人節買巧克力給自己…(哭)
設定一個以上的參數也是 OK 的!
1 | def play_baseball(pitcher, catcher, batter) |
聽說在 Ruby 3.0 版本後,方法帶入的參數還會增加型別限制!期待!
Ruby 方法的命名習慣
除了可以用常見的英文、底線及數字的組合替方法命名之外,有時候還會看到帶有問號 ?
、驚嘆號 !
或 =
的方法,它們通常代表了某種特殊含義,但這些符號只能放在方法名字的最後面。
問號 ?
表示這個方法會回傳 true
或 false
譬如:
1 | [1, 2, 3, 4, 5].include?(2) |
驚嘆號 !
表示使用這個方法可能會產生「副作用」!
我直接舉個簡單的例子,先假設有一個陣列 array
:
1 | array = [1, 1, 2, 3, 3] |
使用 uniq
這個方法把重複的元素去掉:
1 | array.uniq |
這時候原本的 array
沒有產生改變:
1 | array |
但是如果我用的是 uniq!
這個方法把重複的元素去掉:
1 | array.uniq! |
這時候原本的 array
就變成了:
1 | array |
至於在方法名稱後面加上等號 =
的意義,目前我也還說不出個所以然,只好先把我的參考資料放在這,等日後再回來補齊了:
在 Ruby 或 Rails ,我們經常會使用這樣的命名慣例,以節省大家的工作時間,我覺得這是非常棒的一個共識。
如果想更深入研究 Ruby 的方法,非常推薦大家先拜讀龍哥的這篇文章:如果想要找某個方法的定義,該怎麼找? 今天就先到介紹這邊啦!