2012-11-04 43 views
24

Tôi đang cố gắng quấn đầu quanh mục đích sử dụng phương pháp khởi tạo. Trong hướng dẫn Hartl, ông sử dụng ví dụ ..Phương pháp khởi tạo trong đường ray là gì

def initialize(attributes = {}) 
    @name = attributes[:name] 
    @email = attributes[:email] 
end 

là khởi tạo thiết lập các biến dụ @name@email đến các thuộc tính, và nếu như vậy tại sao chúng ta có lập luận attributes = {}?

Trả lời

32

Ruby sử dụng phương thức initialize làm hàm tạo của đối tượng. Nó là một phần của ngôn ngữ Ruby, không cụ thể cho khung Rails. Nó được gọi khi bạn instanstiate một đối tượng mới như:

@person = Person.new 

Gọi phương thức mức new lớp trên Class phân bổ một loại của lớp đó, và sau đó gọi phương pháp của đối tượng initialize:

http://www.ruby-doc.org/core-1.9.3/Class.html#method-i-new

Tất cả các đối tượng đều có phương thức mặc định là initialize không chấp nhận tham số (bạn không cần phải viết một tham số - bạn tự động nhận được thông số này). Nếu bạn muốn đối tượng của bạn làm điều gì đó khác trong phương thức initialize, bạn cần xác định phiên bản của riêng bạn.

Trong ví dụ của bạn, bạn đang chuyển băm đến phương thức initialize có thể được sử dụng để đặt giá trị mặc định là @name@email.

Bạn sử dụng này như:

@person = Person.new({name: 'John Appleseed', email: '[email protected]'}) 

Lý do initializer có một giá trị mặc định cho các thuộc tính (attributes = {} đặt giá trị mặc định cho một băm ampty - {}) là để bạn cũng có thể gọi nó mà không cần phải để vượt qua một đối số. Nếu bạn không chỉ định đối số, thì attributes sẽ là một băm rỗng, và do đó cả hai @name@email sẽ là giá trị nil vì không có giá trị cho các khóa đó (:name:email).

+3

Một vài điểm nữa: cơ chế sử dụng 'initialize' thực sự là một Ruby không phải là một Rails. Việc chuyển một giá trị băm rỗng làm giá trị mặc định cho các thuộc tính ('attributes = {}') sẽ trả về giá trị nil khi cố gắng truy cập khóa không được đặt trên hash 'attributes [: name] # nil' - nếu không có giá trị mặc định được thiết lập (như 'khởi tạo (thuộc tính)' truy cập thuộc tính trong phương thức sẽ ném một lỗi 'thuộc tính [: something] # error'. – tamersalama

+0

Điểm tốt - được chỉnh sửa để làm rõ rằng nó là một phần của Ruby và được liên kết với tài liệu Ruby giải thích phương thức 'mới' và cách nó gọi' initialize'. –

+0

Michael và tamersalama, cảm ơn thông tin. Tôi hiểu là đã khởi tạo ngay bây giờ – jason328

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