Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành thạo Attribute Accessor Ruby: Sử dụng attr_accessor, attr_writer, attr_reader

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:

  • protein
  • protein=

Đâ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_accessor
  • attr_reader
  • attr_writer

Khác biệt là gì?

Vậy, attr_accessor tạo cả READER và WRITER.

  • attr_reader chỉ tạo reader.
  • attr_writer chỉ 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.