iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 系列 第 8

方法 <> 我斑願稱你為最強!站上頂點的方法只有一個 - 滿滿的紅寶石不拿嗎?

  • 分享至 

  • twitterImage
  •  

[Day08] 想要變強就要不斷修煉,這是唯一的方法!

啊啦啦標題不小心用了火影梗,常常聽別人說,做事情要用對方法,這件事在 Ruby 的世界裡也是一樣的!

所以說,方法係啥?為什麼要使用方法?程式語言裡的方法是什麼?

什麼是方法?

正常來說,我們不會想把所有的程式碼寫在同一個檔案裡。而且如果是在開發專案,隨著複雜度提升,不同的程式通常會依照功能和類別(也可能只是按英文字母的順序)排列,分佈在專案裡的不同位置。

不過,由於不同的位置也會需要用到共同的程式碼,為了避免重複 coding,這時候就會透過 方法(method) 來解決這個問題,如果是學過 Javascript 函式(function)的朋友們,應該可以很快知道我在說什麼,它與 Ruby 的方法實際上是非常接近的東西。

為什麼要使用方法

  1. 可一直重複使用
  2. 讓程式碼更容易理解

先來看看在 Ruby 如何定義一個方法:

def method_name
  # 這個方法要做的事情
end

每個方法都會被賦予一個名稱,會使用 defend 兩個單詞來定義方法,而夾在中間的部分則是要請這個方法做的事情。

一旦定義了一個方法以後,就可以開始使喚它做事...(誤)

無論何時何地,取名字都要小心謹慎!

變數方法 的名稱如果相同時,同名的 變數 會蓋掉同名的 方法,需要特別留意!所以在命名方法時,請花點時間好好思考,取個獨一無二又能看出在做什麼的名字吧!


參數與引數

剛剛已經介紹了如何定義方法,不過在定義方法時,還可以設定這個方法需要哪些參數(parameter)

def walk(place) 
  puts "我想去#{place}散步!"
end

由於我們設定 walk 需要一個參數 place,所以在呼叫 walk 時,也必須要剛好給一個引數(argument),多了或少了都不行,在 Ruby 的世界裡,只要引數和參數的數量不同,方法就無法順利執行。

重新整理一下:

  • 參數:定義方法使用要帶入的東西,類似規格的概念。
  • 引數:呼叫方法時帶入的東西,引數的數量必須與定義方法時相同。

接下來,我們來呼叫看看這個 walk 方法!


方法!我呼叫你!

呼叫(invoke)方法的意思其實就是使用這個方法,算是技術圈的術語之一吧,總覺得有一種召喚某某方法來幫自己完成一件事的感覺。另外,也有看過其他大大稱為「調用」,只是我更習慣把它稱為「呼叫」。

要執行已經定義的方法的方式很簡單,只要直接呼叫方法的名字即可:

walk("公園")

# 印出:
我想去公園散步!

甚至省略了 ( ) 也可以,這是 Ruby 獨有的祕技!

walk"公園"

# 印出:
我想去公園散步!

事實上,方法還可以被物件(object)所呼叫,不過那部分就等介紹到類別與物件的時候再一起說明吧!

請放心呼叫方法吧!

比起 Javascript 在呼叫函式時一定要有 () ,Ruby 是不是厲害許多呢!(不小心就引戰了)不過,前提是要記得自己定義過哪些方法...

你的名字是?あなたのお名前は?


方法的參數也可以有預設值

在定義方法的時候,我們可以先給參數一個預設值,這麼一來,如果在呼叫方法時沒有給引數,方法會以預設值去執行,假裝自己有拿到引數

def valentine(gift = "chocolate")
  puts "謝謝妳送我#{gift}! 我很開心!"
end

# 呼叫
valentine

# 印出
謝謝妳送我chocolate! 我很開心!

突然想到有一年情人節買巧克力給自己...(哭)

設定一個以上的參數也是 OK 的!

def play_baseball(pitcher, catcher, batter)
    puts "需要 #{pitcher}, #{catcher}, #{batter} 才能打棒球"
end

play_baseball("熱狗", "爆米花", "可樂")

# 印出:
需要 熱狗, 爆米花, 可樂 才能打棒球

聽說在 Ruby 3.0 版本後,方法帶入的參數還會增加型別限制!期待!


Ruby 方法的命名習慣

除了可以用常見的英文、底線及數字的組合替方法命名之外,有時候還會看到帶有問號 ? 、驚嘆號 != 的方法,它們通常代表了某種特殊含義,但這些符號只能放在方法名字的最後面。

問號 表示這個方法會回傳 truefalse

譬如:

[1, 2, 3, 4, 5].include?(2)     
=> true

驚嘆號 ! 表示使用這個方法可能會產生「副作用」!

我直接舉個簡單的例子,先假設有一個陣列 array

array = [1, 1, 2, 3, 3]

使用 uniq 這個方法把重複的元素去掉:

array.uniq
=> [1, 2, 3] 

這時候原本的 array 沒有產生改變:

array
 => [1, 1, 2, 3, 3] 

但是如果我用的是 uniq! 這個方法把重複的元素去掉:

array.uniq!
 => [1, 2, 3] 

這時候原本的 array 就變成了:

array
 => [1, 2, 3] 

至於在方法名稱後面加上等號 = 的意義,目前我也還說不出個所以然,只好先把我的參考資料放在這,等日後再回來補齊了:

在 Ruby 或 Rails ,我們經常會使用這樣的命名慣例,以節省大家的工作時間,我覺得這是非常棒的一個共識。


如果想更深入研究 Ruby 的方法,非常推薦大家先拜讀龍哥的這篇文章:如果想要找某個方法的定義,該怎麼找? 今天就先到介紹這邊啦!


上一篇
迴圈 <> 惡魔風腳開踢!比香吉士的眉毛還會轉 - 滿滿的紅寶石不拿嗎?
下一篇
回傳 <> 受傷了就趕快回船上治療! - 滿滿的紅寶石不拿嗎?
系列文
滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言