11/08/2018, 21:19

Getter and Setter method in Ruby

Bài viết này mình sẽ nói về getter & setter method và attribute trong Ruby Getter method khi lấy giá trị của instance variable Setter method khi muốn thay đổi giá trị của instance variable Xem ví dụ dưới đây: class User def initialize(name) @name = name end # getter method ...

Bài viết này mình sẽ nói về getter & setter method và attribute trong Ruby

Getter method khi lấy giá trị của instance variable
Setter method khi muốn thay đổi giá trị của instance variable

Xem ví dụ dưới đây:

class User
  def initialize(name)
    @name = name
  end
  # getter method
  def getter_name
    @name
  end
  # setter method 
  def setter_name=(name) # Đây là cách viết của setter method
    @name = name
  end
end

user = User.new('Paul')
# Lấy tên user bằng cách dùng getter method
user.getter_name #  Tên lúc này là Paul
# Thay đổi tên user bằng cách dùng setter method
user.setter_name = "Brian" #  Tên lúc này là Brian

Qua ví dụ trên bạn thấy để viết method getter & setter nó khá là dài. Vậy có cách nào rút ngắn code hơn không? Câu trả lời là có
Ruby có cung cấp cho bạn các loại attributes sau giúp bạn có thể sử dụng nó dễ dàng hơn:
attr_reader:
Cái này tương đương với getter method
attr_writer:
Cái này tương đương với setter method
attr_accessor:
Nếu đã có attr đại diện cho getter và setter method. Vì sao lại có attr_accessor này?
attr_accessor là kết hợp giữa attr_reader && attr_writer có nghĩa là 1 method vừa có tính chất của getter & setter

Cách sử dụng của 3 attributes trên là bạn phải đặt tên của attribute trùng mới tên của variable.
Ví dụ trên dùng với attributes

class Item
  attr_reader :getter_item
  attr_writer :setter_item
  attr_accessor :accessor_item
  def initialize(getter_item, setter_item, accessor_item)
    @getter_item = getter_item
    @setter_item = setter_item
    @accessor_item = accessor_item
  end
end

item = Item.new('this is a getter', 'this is a setter', 'this is an accessor')
item.getter_item
item.setter_item = "update value for setter"
item.accessor_item = "update value for accessor"
0