# Ruby 方法 ## method 特色: 1. 用一個比較能理解的名子來辨識(命名很重要!!) 2. 可以重複使用 定義方法: ```ruby= def method_name (param1 ,param2) # .... end ``` 範例: ```ruby= def say_hello_to(someone) puts "hi, #{someone}" end say_hello_to("Mike") #印出 hi, Mike say_hello_to("Tim") #印出 hi, Tim ``` 呼叫方法時,可以**適時**省略小括號 (Ruby為了好辨識設計的) 範例: ```ruby= def say_hello_to(someone) puts "hi, #{someone}" end say_hello_to "Mike" #印出 hi, Mike say_hello_to "Tim" #印出 hi, Tim ``` 同名的方法和變數時,Ruby會先找變數 範例: ```ruby= age = 18 def age return 20 end puts age # 印出 18 ``` 同名的情況下,可以用加小括號的方式來呼叫方法 範例: ```ruby= age = 18 def age return 20 end puts age() # 印出 20 ``` :::success 若沒有參數時可以適時地去除小括號,但如果有參數,為了好辨識通常還是會加上小括號增加閱讀性。 ::: ### 參數預設值 在參數後方指定預設值,若沒有給引數就會帶入參數後方的預設值 ```ruby= def say_hello_to(someone = "Tim") puts "hi, #{someone}" end say_hello_to() # 印出Tim ``` ### return 回傳值 回傳 = 交回控制權 ```ruby= def doubleC(num) puts 2 * num #無回傳結果,所以method本身沒有回傳值 end p doubleC(3) # 6 # nil ``` ```ruby= def doubleA(num) p num * 2 # 印出 2 倍的值,但沒有回傳值 end def doubleB(num) return num * 2 # 回傳 2 倍的值,但不會印出內容 end doubleA(5) #呼叫 doubleA 方法 p doubleB(5) #印出呼叫 doubleB 方法的內容 ``` :::warning 上述範例的doubleA沒有出現nil,是因為p本身有回傳值,但puts沒有回傳值。!!不要用p來取代return ::: return 可以適時的省略,會自動回傳**最後一行**的**執行結果** ```ruby= def add_three(n) n+3 end p add_three(2) #回傳 5 ``` ### 問號和驚嘆號 1. 可以是命名的一部份,但只能放在最後面 2. **問號**通常是回傳**真假值**,**驚嘆號**通常表示**要注意** 問號範例 ```ruby= def is_adult?(age) if age > 18 return true else return false end end p is_adult?(20) #true p is_adult?(17) #false ``` 驚嘆號範例 一般來說sort的時候,原本的陣列是不會被影響的 ```ruby= list = [9,5,2,7] p list.sort # [2,5,7,9] p list # [9,5,2,7] ``` 但加了驚嘆號後,會破壞原本的陣列 ```ruby= list = [9,5,2,7] p list.sort! # [2,5,7,9] p list # [2,5,7,9] ``` function跟method的不同? method 有作用對象 function 執行功能 精簡method 原本 ```ruby= def is_adult?(age) if age > 18 return true else return false end end ``` shorthand ```ruby= def is_adult?(age) return age > 18 # return也可以省略 end ```