在 ruby 裡 initialize 方法是建立物件的過程其中一部份,他可以上你設定物件的初始值,在其他的程式語言裡被稱作 “constructor“。
舉個例子:
你有一個 ”點“ 類別,這個 ”點“ 需要兩個座標 X 跟 Y。那你要怎麼把值傳給物件呢?你可以這樣做:
Point.new(10, 20)
這個 new 方法就是你在 ruby 裡建立新物件的方法,或是透過其他類別。 New & Initialize 這兩個方法之間的關係,有注意到 10 & 20 兩個引數?這裡我們先回到 initialize 方法。如果你試著將引數給 new 但是卻沒有在類別裡定義 initialize 方法這樣是不行的。
這樣會發生引數錯誤:
ArgumentError: wrong number of arguments (2 for 0)
Because when you call new, Ruby calls initialize!
你必須先這樣做:
class Point
def initialize(x, y)
end
end
現在你就可以在建立一個“點”物件的時候帶入兩個引數了。所以整個 initialize 方法的重點就是讓你在建立物件的時候可以傳入引數。
當引數被傳給 initialize 之後並不會自動儲存起來,你必須使用實體變數抓住他,像這樣抓:
class Point
def initialize(x, y)
@x = x
@y = y
end
end
這樣就會把 X & Y 的值分配給 @x & @y 這兩個實體變數,之後就可以透過這兩個實體變數拿到你想要的值。
你可以定義可選擇或預設的引數。
initialize 方法裡面使用 return 是不合理的,因為他是特別的而且永遠會回傳一個新物件。
如果你的類別不需要引數,那定義 initialize 就不是必要的了。
簡單的例子:
如果你的類別都是關於 Github API 的運作,你就不會想對 api 預先載入請求。
你只是想儲存 api key 在一個實體變數,或者類別需要的資料
將 hashes 跟 Built-In 物件初始化, Built-In 跟 hashes 有特別的方法建立跟初始化。
建立 hashes:
h = Hash.new
h = Hash['a', 1]
h = {}
建立字串:
s = String.new
s = ""
s = %Q()
建立陣列:
a = Array.new(5)
a = %w(a b c)
a = []
%w 可以建立字串的陣列
了解 initialize 方法以及 initialize 跟 new 方法的關係以及物件建立了基礎,可以去看看關於物件導向程式設計會更有幫助。