為自己學Ruby on Rails [06- 懶惰的工程師會想知道Ruby中attr_accessor、attr_reader、attr_writer是怎麼用?]

SANDRA
:: SANDRA ::菜菜工程師X全馬挑戰
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
end
My = 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
end
My = Name.new(‘Sandra’)
puts My.name #=>Sandra
My.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
end
My = 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
end
My = 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
end
My = Girl.new(‘Sandra’,28)
puts My.name #=>Sandra
puts My.age #=>28
My.name=’Ivy’
My.age=18
puts My.name #=>Ivy
puts My.age #=>18

比較表整理:attr_accessor、attr_reader、attr_writer

--

--