12/08/2018, 15:29

Accessors in ruby

Khi thiết kế lớp, với mỗi thuộc tính chúng ta sẽ định nghĩa 2 phương thức là getter và setter, mục đích của 2 phương thức này là để truy xuất dữ liệu và chỉnh sửa chúng. Trong Ruby thì có sẵn 3 phương thức là attr_reader, attr_writer và attr_accessor dùng để tự tạo các phương thức getter và ...

  • Khi thiết kế lớp, với mỗi thuộc tính chúng ta sẽ định nghĩa 2 phương thức là getter và setter, mục đích của 2 phương thức này là để truy xuất dữ liệu và chỉnh sửa chúng.
  • Trong Ruby thì có sẵn 3 phương thức là attr_reader, attr_writer và attr_accessor dùng để tự tạo các phương thức getter và setter.
  • Phương thức attr_reader sẽ tạo các phương thức getter trong khi phương thức attr_writer sẽ tạo các phương thức setter. Phương thức attr_accessor sẽ tạo cả getter, setter và các biến instance của object(hay chính là các thuộc tính của class đó, lưu ý phân biệt biến instance của object và instance của class)
  1. Khi chưa tạo các phương thức getter và setter
class Car
end

car = Car.new
car.name # => no method error
  1. Tạo phương thức getter: lấy name của Car nhưng chưa tạo hàm xử lý cho thuộc tính name
class Car
  def name
    @name # simply returning an instance variable @name
  end
end

car = Car.new
car.name # => nil
car.name = "Dennis" # => no method error

Ở đây ta có thể gọi được method name nhưng ko thể gán gía trị cho nó được.

  1. Tạo các method getter và setter cho thuộc tính name
class Car
  def name
    @name || 'name of car'
  end

  def name=(str)
    @name = str
  end
end

car = Car.new
car.name = 'Name of car'
car.name # => "Name of car"

Như đã thấy thì ta có thể gán giá trị cho thuộc tính name và thực hiện lấy giá trị thuộc tính name được

Với một lớp mà có rất nhiều thuộc tính, mà mỗi thuộc tính ta lại phải viết 2 phương thức getter, setter cho nó. Nên Ruby có hỗ trợ 2 phương thức đó là attr_reader(để tạo ra các phương thức getter), attr_writer(để tạo ra các phương thức setter). Nên ta có:

class Car
  attr_reader :name, :price
  attr_writer :name, :price

  def to_s
    "#{@name}: #{@price}"
  end
end
  • Hơn thế nữa, Ruby còn cung cấp method attr_accessor để có thể tạo cả các phương thức getter và setter. Nên ta có thể viết gọn lại
class Car
  attr_accessor :name, :price
 
  def to_s
    "#{@name}: #{@price}"
  end
end
  • Sử dụng attr_accessor_with_default. Nhưng với ruby version >2.0 Không còn hỗ trợ nữa
class Car
  attr_accessor_with_default :name, 'Name default'
end

=> Thay vào đó ta sẽ định nghĩa lại giá trị default cho thuộc tính của lớp đó

class Car
  attr_writer :name

  def name
    @name || 'Name default'
  end
end

Kết luận: Ruby cung cấp 3 phương thức: attr_reader, attr_writer và attr_accessor dùng để tự tạo các phương thức getter và setter.

  • attr_accessor: tạo cả các phương thức getter và setter
  • attr_reader: tạo các phương thức getter
  • attr_writer: tạo các phương thức setter Bên cạnh đó mình có thể sử dụng 1 trong hai phương thức attr_reader hoặc attr_writer và định nghĩa lại các phương thức setter hoặc getter theo ý mình(như ví dụ ngay trên).
0