Bài viết này về attribute accessor (attr_accessor) trong Ruby.
Nếu bạn vội, cuộn xuống dưới.
Vì tôi muốn bắt đầu bằng việc giải thích:
Tại sao chúng ta dùng attribute accessor!
Giả sử bạn có class với instance variable và muốn expose chúng ra bên ngoài.
Làm sao?
Bạn phải định nghĩa phương thức.
Chỉ phương thức mới truy cập được instance variable.
Tại sao?
Vì bạn sẽ gặp lỗi nếu không làm vậy.
Ví dụ:
class Food
def initialize(protein)
@protein = protein
end
end
bacon = Food.new(21)
bacon.protein # NoMethodError: undefined method `protein'
NoMethodError là lỗi khi bạn yêu cầu giá trị protein mà không có setup đúng.
Giải pháp?
Bạn tự định nghĩa phương thức như sau:
class Food
def protein
@protein
end
end
bacon.protein # 21
Trong OOP ngôn ngữ khác đây gọi là phương thức "getter". Bạn định nghĩa phương thức lấy giá trị instance variable.
Bạn cũng có thể muốn thay đổi giá trị.
Cho đó, bạn cần phương thức khác, như sau:
class Food
def protein=(value)
@protein = value
end
end
bacon.protein = 25
Hãy tưởng tượng bạn mở một cổng vào object để thay đổi giá trị.
Đó chính là việc này làm.
Bây giờ:
Có cách tốt hơn để định nghĩa loại phương thức này không?
Giống như shortcut?
Có!
Đó là lúc attr_accessor xuất hiện.
Ví dụ Ruby attr_accessor
Bạn có thể bảo Ruby tạo các phương thức này cho bạn với attr_accessor.
Cách làm:
class Food
attr_accessor :protein
def initialize(protein)
@protein = protein
end
end
Nhìn dòng này:
attr_accessor :protein
Đây là phương thức Ruby tạo ra các phương thức khác cho bạn.
Tạo phương thức gì?
Với ví dụ này, nó tạo:
proteinprotein=
Đây chính là các phương thức chúng ta tạo trước…
Nhưng giờ bạn không cần gõ chúng ra.
Đây là shortcut!
attr_accessor vs attr_reader
Ngoài attr_accessor, bạn còn có các accessor khác.
Chính xác ba loại:
attr_accessorattr_readerattr_writer
Khác biệt là gì?
Vậy, attr_accessor tạo cả READER và WRITER.
attr_readerchỉ tạo reader.attr_writerchỉ tạo writer.
Nói cách khác:
Với attr_reader bạn chỉ đọc giá trị, không thay đổi. Với attr_writer bạn chỉ thay đổi giá trị nhưng không đọc được.
Nhiều Instance Variable
Muốn định nghĩa nhiều attribute method?
Làm được.
Nhưng phải dùng đúng cú pháp.
Như sau:
attr_reader :name, :value, :ready?
Bạn có thể tạo bao nhiêu tùy thích.
Xem Video hướng dẫn
Tóm tắt
Bạn đã học về attribute accessor trong Ruby! Một bộ 3 phương thức (attr_accessor, attr_writer và attr_reader) để truy cập và thiết lập instance variable từ bên ngoài class.
Giờ là lúc thực hành.