iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
0
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 16

<Day 16>怎麼使用 ruby 的 initialize 方法

  • 分享至 

  • xImage
  •  

在 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 的一些觀點

你可以定義可選擇或預設的引數。
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 方法的關係以及物件建立了基礎,可以去看看關於物件導向程式設計會更有幫助。


上一篇
<Day 15>attr_reader, attr_writer, attr_accessor
下一篇
<Day 17>今晚我想來點 route
系列文
今晚我想來點 Ruby on Rails 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言