Có thể giải thích sự khác biệt giữa việc truy cập thuộc tính cá thể qua self.attribute
và @attribute
không?Truy cập trực tiếp biến thể hiện so với Sử dụng phương thức truy cập
77
A
Trả lời
97
self.attribute
gọi phương thức attribute
.
self.attribute = value
gọi phương thức attribute=
với đối số value
.
@attribute
và @attribute = value
lấy/đặt giá trị của biến mẫu @attribute
.
Vì vậy, về cơ bản chúng là hai điều hoàn toàn khác nhau.
Tuy nhiên nếu bạn gọi attr_accessor :attribute
, hãy xác định phương thức attribute
để trả lại @attribute
và phương pháp attribute=(value)
để đặt @attribute = value
. Vì vậy, trong trường hợp đó, không có sự khác biệt.
1
"Truy cập instance variable trực tiếp là nhanh hơn so với truy cập chúng với các phương pháp accessor khoảng hai lần"
Kiểm tra ra: http://greyblake.com/blog/2012/09/02/ruby-perfomance-tricks/
Lưu ý rằng nó thường được khuyến cáo sử dụng 'self.' (trừ khi bạn viết phương thức getter/setter) ngay cả khi bạn _currently_ có 'attr_accessor'. Điều này bảo vệ bạn khỏi các công việc tái cấu trúc bổ sung và các lỗi nếu sau này bạn thay đổi (các) phương thức accessor để làm nhiều hơn là chỉ nhận/thiết lập biến cá thể. (Hoặc nếu ai đó vá hoặc phân lớp công việc của bạn.) – Phrogz
Một trong những lỗi mà Phrogz đang nói đến là bạn chỉ cần gọi thuộc tính = _____ thay vì self.attribute = ______ bạn đang thiết lập biến cục bộ thay vì biến mẫu. –