在後面 rails 教學的部分,method 的運用扮演著非常重要的角色。當中你可能不需要自己定義一個 method,但卻無法避免需要大量使用其他人所寫的 method。這時候看懂自己在寫些什麼就變成一件非常重要的事。下面整理了一些 method 的基礎還有一些未來你會看到的 method 它們為什麼是這樣寫的範例。
很多時候會發現自己使用相同的程式碼很多次,這時候就可以將它們合併在一個 method 裡面重複利用。這樣會有以下兩個好處:
- 加速開發,用一個 method 取代多行程式
- 更好維護,如果需要修改,只要改一次就可以讓所有地方都被改道
每個人的專業領域不同,不可能有人可以精通所有功能的實作。所以懂的做出某個功能的人可以將程式寫好,包在 method 裡面,讓其他人就算不知道這個功能是怎麼做出來的,也可以達到相同的目的。
就算是自己寫的程式,有時候也需要分類,方便之後來維護。例如控制一個機器人出門可能可以分成走路、開門及關門三個 method,每一個可能都有很複雜的程式。這樣當開門這個步驟出現問題的時候,可以直接去找開門對應到的 method,針對那個部分進行 debug 就好,不用一次看著所有的 code 慢慢尋找。如此可以節省很多時間,也會讓腦袋比較清晰。
定義方法:
def greet
puts 'Hello!'
end使用方法:
greet有參數的 method 定義方法:
def say_hi_to(name)
puts "Hi #{name}"
end使用方法:
say_hi_to('alpaca')ruby 社群在命名的時候,如果是多個單字的組合,習慣採用蛇形命名法(snake case)。這種命名法是用底線連結每個單字,例如剛剛的 say_hi_to 就是把 say hi to 用底線連接而成。
定義方法:
def greet_three_people(name1, name2, name3)
puts "Hi #{name1}, #{name2} and #{name#}"
end使用方法:
greet_three_people('Alice', 'Bob', 'Tom')在 ruby 中大部分的時候,當你在使用 method 時傳入參數,後面的括號是可以省略的!我們常用的 puts 也是其中一個例子,這也是為什麼我們會可以寫 puts 'Hello, world!' 而不用一定要寫 puts('Hello, world!'),雖然這樣也可以。
未來常見範例:
# 有括號的樣子:link_to('Articles', '/articles')
link_to 'Articles', '/articles'
# 有括號的樣子:redirect_to(article_path(article))
# 這個例子其實是在 method 裡面又放入一個 mothed
redirect_to article_path(article)在 rails 裡面的 method 常常最後面都會傳入一整個 hash 讓使用者可以做很多額外的設定。而如果參數的最後一個是一個 hash 的話可以把大括號省略掉。
未來常見範例:
# 未省略的樣子:form_for @article, { url: '/articles', remote: true, method: 'post' }
form_for @article, url: '/articles', remote: true, method: 'post'
# 未省略的樣子:Article.create { title: 'test', content: 'this is a test' }
Article.create title: 'test', content: 'this is a test'Method 除了可以幫你重複執行一些之外,很大一部份也是用來幫你計算某些結果然後傳出來給你使用。例如你可以寫一個 method 幫你計算某個數的三次方:
def cubed(x)
return x * x * x
end使用 return 就可以將想要的結果回傳出去,在使用的時候就可以直接接收:
cubed_number = cubed(2)這樣就可以把 cubed_number 指定為 8。
當你使用 return 之後,method 就會跳出,並且回傳你的回傳值。所以無論下面還有千千萬萬行程式,都不會被執行。例如:
def cubed(x)
return x * x * x
puts '這行不會被執行!'
end上面這個例子,在使用 return 之後這個 method 就結束了。所以下面這行 puts '這行不會被執行!' 就不會被印在 terminal 裡面囉。
比較值得注意的是,在 ruby 中所有 method 都一定有回傳值,所以如果你沒有寫 return 那 ruby 就會回傳它最後執行的程式的回傳值。例如剛剛的 method 最後運算的東西是 x * x * x 所以就算不寫 return,三次方的結果也會被自動回傳。所以這樣很多人會直接寫成:
def cubed(x)
x * x * x
end往後也會看到一些這樣的例子,就要注意雖然沒有寫 return 但實際上還是有回傳值的,例如:
def article_params
params.require(:article).permit(:title, :content)
end其實就是把 return 省略了,原文應該長這樣:
def article_params
return params.require(:article).permit(:title, :content)
end