# 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
```