Ruby 是一款物件導向程式語言(Objecte-Oriented Programming, OOP),也就是說在 Ruby 裡,幾乎所有的東西都是物件。
物件(Objects):
物件有兩個主要特性:狀態(state)和行為(behavior)。狀態是指物件的屬性或數據,而行為是指物件可以執行的方法或函數。
類別(Classes):
類別是用來定義物件的模板或藍圖。你可以將類別視為一個定義了物件屬性和方法的模型。
類別是用 class 關鍵字來定義的,例如:
class Person
def initialize(name, age)
@name = name
@age = age
end
def greet
puts "Hello, my name is #{@name} and I'm #{@age} years old."
end
end
類別跟物件的關係,就像是章魚燒烤盤跟章魚燒一樣,烤盤就是類別(class),負責定義出章魚燒要有哪些東西,而章魚燒就是實體(Instance),一樣形狀的模具,放一樣的原料進去,做出來的章魚燒應該都會長得一樣。
由於 Ruby 裡面並沒有屬性(attribute)這樣的設計,要取用實體變數,需要另外定義的方法才行:
class Customer
def initialize(id, name)
@id = id
@name = name
end
# 建立取得 instance variable 的方法
# 方法的名稱通常會和arguments, 實例變數一樣。
def id
@id
end
def name
@name
end
end
那不是代表每次寫class的時候我都要寫這麼一長串? 因此Ruby有一個方法可以利用,就是setter/getter
如果沒有使用attr_reader
的情況
class Customer
def initialize(id, name)
@id = id
@name = name
end
# 建立取得 instance variable 的方法
# 方法的名稱通常會和arguments, 實例變數一樣。
def id
@id
end
def name
@name
end
end
aaron = Customer.new(1, "Aaron", "Tainan")
p aaron.id #1
p aaron.name # "Aaron"
使用 attr_reader的情況
class Customer
attr_reader :id, :name
def initialize(id, name)
@id = id
@name = name
end
aaron = Customer.new(1, "Aaron", "Tainan")
p aaron.id #1
p aaron.name # "Aaron"
可以看到有了attr_reader
之後,可以少寫了很多用來定義屬性的方法,並且整個城市馬也乾淨了許多。
但由於attr_reader
只有讀取屬性,如果要更改屬性的內容的話我們還需要使用attr_setter
沒有使用attr_setter
的情況
class Customer
attr_reader :id, :name, :addr
def initialize(id, name, addr)
@id = id
@name = name
@addr = addr
end
# 更改/設定 instance variable 的方法
def id=(value)
@id = value
end
def name=(value)
@name = value
end
def addr=(value)
@addr = value
end
end
aaron = Customer.new(1, "Aaron", "Tainan")
p aaron.id # 1
aaron.id = 2 # 重新設定實例變數
p aaron.id # 2
使用 attr_writer
class Customer
attr_reader :id, :name, :addr #快速取得 instance variable
attr_writer :id, :name, :addr #快速設定 instance variable
def initialize(id, name, addr)
@id = id
@name = name
@addr = addr
end
end
aaron = Customer.new(1, "Aaron", "Tainan")
p aaron.id # 1
aaron.id = 2 # 重新設定實例變數
p aaron.id # 2
attr_accessor
:同時建立 setter 和 getter
class Customer
attr_accessor :id, :name, :addr # 等於同時寫了 attr_reade 和 attr_writer
def initialize(id, name, addr)
@id = id
@name = name
@addr = addr
end
end
參考資料:
https://pjchender.dev/ruby-on-rails/ruby-object/
https://railsbook.tw/chapters/08-ruby-basic-4