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)
- 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
- 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.
- 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).