這部分的觀念相當重要喔,大家使用 ruby 主要為了可以好好操作 rails 這個開發框架,裡面內部組成,除了前面的資料類型及邏輯判斷等,再來務必要認識的就是這些方法(Method)跟區塊(Block)的使用了。有一定的認識後進入 rails 的世界才能看懂其中的奧妙呀!

方法 (Method)

為什麼要使用?

有些時候我們會重複做一些指令,如果可以簡單幾行字就能呼叫一連串的指令,然後可以重複利用在不同的地方,就是我們為什麼會要使用方法的原因啦。

如何定義與使用?

如同標題我們要定義就是使用 define 這個英文的簡寫 def 來開頭,後面宣告這個方法的名稱,名稱很重要最好可以清楚表達執行內容,接著就是放入的參數及要執行的內容,最後再加上 end 結束,後面會介紹到這段def...end的範圍稱為區塊,大概會長成這樣:

1
2
3
4
5
6
def say_hello() # 方法名為say_hello,後面括號可以不放參數
puts "hello"
end

say_hello() # 印出 hello
say_hello # 同上,可以省略括號

參數(parameter)與引數(argument)

很多人都會搞混這部分,認為都是叫做參數。其實是:

  • 參數是在定義方法時後面括號內部物件
  • 引數是在呼叫使用方法時括號內所帶入的物件
1
2
3
4
5
def say_hello_to(name) # 放入參數name
puts "hello, #{name}" # name 所放的引數會被帶入
end

say_hello_to(Sean) # 帶入Sean作為引數,印出 hello, Sean

使用注意參數與引數的數量

必須一個蘿蔔一個坑對入,如果參數有 3 個,只要引數不等於 3 個都是會出錯的!!

1
2
3
4
5
6
7

def add(a,b,c)
a + b + c
end

add (1,2) # 出錯,少一個
add (1,2,3,4) # 出錯,多一個

參數預設值

方法的參數可以用 “=” 先預設好喔

1
2
3
4
5
6
def say_hello_to(name ="Ken") # 預設name為"Ken"
puts "hello, #{name}"
end

say_hello_to(Sean) # 印出 hello, Sean
say_hello_to() # 有預設如果沒引數會自動帶入預設"Ken"作為引數,印出 hello, Ken

回傳

從前面的例子如果有注意到其實方法的最後一行就是所謂的回傳值,注意特別的是 Ruby 中 return 可以適時的省略,自動回傳最後一行。

比較需要注意很多人以為用 puts 印出就表示回傳了,其實 puts 是沒有回傳值的,沒回傳就會回傳 nil。

1
2
3
4
5
6
7
# puts沒有回傳
def double_num(num)
puts num * 2 # 印出 2 倍的值,但其實是沒有回傳值的
end
p double_num(5) # 會印出什麼?答案是 10 跟 nil 喔!!

# 回傳值
1
2
3
4
def double_num(num)
return num * 2 # 回傳 num*2 ,可以省略return
end
p double_num(5) # 印出 10

? 及 ! 究竟在幹嘛?

  • ? 跟 ! 可以是命名的一部份,但只能放在最後面
  • 問號通常會回傳真假值,而驚嘆號通常表示要注意!
1
2
3
4
5
6
7
def is_adult?(age)
if age >= 18
return true
else
return false
end
end
1
2
3
4
5
6
list = [1,4,3,2]

p list.sort # 排序但不改變原本陣列,印出[1,2,3,4]
p list # 原本陣列還是印 [1,4,3,2]
p list.sort! # 排序但改變原本陣列 [1,2,3,4]
p list # 原本陣列改成 [1,2,3,4]

參考資料:

  1. 為你自己學 ruby on rails
  2. Ruby Docs - Method
  3. [Ruby] 方法/函式(function / method)