2010-05-01 38 views
5

Tôi đang làm việc thông qua một cuốn sách về Ruby và tác giả đã sử dụng một dạng hơi khác để viết định nghĩa khởi tạo lớp học so với những phần trước của cuốn sách. Nó trông giống như thế này:Sự khác biệt giữa hai định nghĩa khởi tạo lớp Ruby này là gì?

class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    self.venue = venue 
    self.date = date 
    end 
end 

Trong phần trước của cuốn sách, nó sẽ đã được định nghĩa như thế này:

class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    @venue = venue 
    @date = date 
    end 
end 

Có sự khác biệt về chức năng giữa sử dụng phương pháp setter, như trong lần đầu tiên ví dụ, so với sử dụng biến ví dụ như trong lần thứ hai? Cả hai dường như làm việc. Thậm chí trộn chúng lên công trình:

class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    @venue = venue 
    self.date = date 
    end 
end 
+0

+1 không được lập trình bởi trùng hợp ngẫu nhiên. –

Trả lời

9

Kể từ khi phương pháp setter đã được định nghĩa bởi attr_accessor và do đó không có gì nhưng cách thiết lập các biến, không có sự khác biệt giữa việc sử dụng phương pháp setter và thiết lập các biến trực tiếp.

Ưu điểm duy nhất để sử dụng phương pháp setter là nếu sau này bạn thay đổi phương thức setter để làm điều gì đó hơn là thiết lập biến (như xác nhận đầu vào hoặc ghi nhật ký), phương pháp initialize của bạn sẽ bị ảnh hưởng bởi những thay đổi này bạn phải thay đổi nó.

+0

+1 Tôi đã nhận thấy rằng thông báo thay đổi là không thể (hoặc khó khăn và không có giấy tờ) với '@ venue', chỉ với' self.venue'. Nếu có ai biết cách để quan sát những người định cư dựa trên thuộc tính, hãy cho tôi biết;) –

Các vấn đề liên quan