為自己學Ruby on Rails [06- 懶惰的工程師會想知道Ruby中attr_accessor、attr_reader、attr_writer是怎麼用?]
Published in
4 min readMay 28, 2021
Ruby中的「getter、setter」?
- getter:在Ruby裡指的就是取出實體變數(instance variable)的方法,如果class裡沒有就無法取出在class內實體變數的值。
class Name
def initialize(name)
@name = name
end
#getter method
def name
return @name #這個 return 通常會省略
end
endMy = Name.new(‘Sandra’)
puts My.name #=>Sandra
- setter:「指派(assign)的方法」的意思,在Ruby裡指的就是指派實體變數(instance variable)的方法,如果class裡沒有就無法指派在class內實體變數的值。
class Name
def initialize(name)
@name = name
end
#getter method(回傳值)
def name
return @name #這個 return 通常會省略
end
#setter method(設定值)
def name=(new_name)
@name = new_name
end
endMy = Name.new(‘Sandra’)
puts My.name #=>SandraMy.name=’Ivy’
puts My.name #=>Ivy
Ruby中的語法糖在這!
- 方法就叫做
name=
,要使用它就是用name=(Tom)
,就是連等號一起呼叫它!
My.name=(‘Sandra’)
#可省略括號
My.name=’Sandra’
#可有空格
My.name = ‘Sandra’
懶惰的工程師覺得麻煩,怎麼辦?
- 在class內加入 [attr_reader :name]就自動幫你產生getter method(8–10行)。
class Name
attr_reader :name def initialize(name)
@name = name
end
#getter method
// def name
// return @name #這個 return 通常會省略
// end
endMy = Name.new(‘Sandra’)
puts My.name #=>Sandra
- 在class內加入 [attr_writer :name]就自動幫你產生setter method(12–14行)。
class Name
attr_reader :name
attr_writer :name def initialize(name)
@name = name
end
#getter method(回傳值)
// def name
// return @name #這個 return 通常會省略
// end
#setter method(設定值)
// def name=(new_name)
// @name = new_name
// end
endMy = Name.new(‘Sandra’)
puts My.name #=>Sandra
工程師還是不想寫成兩行,怎麼辦?(多懶惰XD)
- 在class內加入 [attr_accessor :name],也可以同時帶兩個。
class Girl
attr_accessor :name, :age def initialize(name, age)
@name = name
@age = age
end
endMy = Girl.new(‘Sandra’,28)
puts My.name #=>Sandra
puts My.age #=>28My.name=’Ivy’
My.age=18
puts My.name #=>Ivy
puts My.age #=>18