2013-04-02 30 views
5

Tôi là một newb đang làm việc thông qua một số hướng dẫn Ruby và được stumped về việc sử dụng các phương pháp send dưới đây. Tôi có thể thấy phương thức gửi đang đọc giá trị của trình vòng lặp thuộc tính, nhưng tài liệu Ruby nêu rõ phương thức gửi có phương thức được thêm trước bằng dấu hai chấm. Vì vậy, sự nhầm lẫn của tôi nằm ở cách thức phương thức gửi bên dưới là nội suy biến thuộc tính đang được lặp lại.Phương thức gửi của Ruby với nội suy biến khối

module FormatAttributes 
    def formats(*attributes) 
    @format_attribute = attributes 
    end 

    def format_attributes 
    @format_attributes 
    end 
end 

module Formatter 
    def display 
    self.class.format_attributes.each do |attribute| 
     puts "[#{attribute.to_s.upcase}] #{send(attribute)}" 
    end 
    end 
end 

class Resume 
    extend FormatAttributes 
    include Formatter 
    attr_accessor :name, :phone_number, :email, :experience 
    formats :name, :phone_number, :email, :experience 
end 
+1

'send' cũng có thể lấy chuỗi, không chỉ các biểu tượng. "phương thức được thêm vào với dấu hai chấm" - đó là biểu tượng, khái niệm ruby ​​rất cơ bản. Vậy câu hỏi của bạn chính xác là gì? –

+0

Làm thế nào # {send (attribute)} được nội suy vào giá trị thuộc tính riêng lẻ? – KMcA

+0

'thuộc tính' là tên thuộc tính,' send (attribute) 'nhận giá trị theo tên,' # {send (attribute)} 'chèn nó vào một chuỗi. Nó không khác gì, ví dụ '# {foo}' hoặc '# {10 * 20}'. –

Trả lời

2

Nó không phải là "cách gọi giá trị của iterator", nhưng thay vì gọi một phương thức với cái tên đó. Trong trường hợp này vì khai báo attr_accessor, các phương thức này ánh xạ tới các thuộc tính.

Gọi object.send('method_name') hoặc object.send(:method_name) tương đương với object.method_name nói chung. Tương tự, send(:foo)foo sẽ gọi phương thức foo trong ngữ cảnh.

Kể từ khi module khai báo phương thức sau đó được trộn lẫn với số include, gọi send trong mô-đun có tác dụng gọi phương thức trên một phiên bản của lớp Tiếp tục.

+0

@ tadam, cảm ơn! Là mới tôi đã không xem xét attr_accessor đã biến các thuộc tính thành các phương pháp. Làm cho cảm giác hoàn hảo ngay bây giờ. – KMcA

+1

'attr_reader' tạo phương thức đọc (getter),' attr_writer' tạo phương thức ghi (setter) và 'attr_accessor' tạo cả hai. – tadman

0

send Documentation

đây được đơn giản hóa phiên bản của mã của bạn, để nuôi bạn biết những gì đang xảy ra:

def show 
p "hi" 
end 

x = "show" 
y = :show 

"#{send(y)}" #=> "hi" 
"#{send(x)}" #=> "hi" 
+1

Đáng chú ý rằng 'x =: hiển thị; "# {send (x)}" 'cũng sẽ hoạt động. Tôi nghĩ trong trường hợp này giá trị chuỗi bị ép buộc thành ký hiệu, vì vậy một phần của câu trả lời cho OP có thể là "Ruby cung cấp cưỡng chế tích hợp, và cho phép mã được đăng lên" –

+0

@NeilSlater. công trinh. Đó là nó. Có lỗi gì trong mã của tôi không? sửa tôi. Tôi đã không giúp bạn. –

+0

Không có gì sai với mã của bạn. Tôi đã chỉ cố gắng tham gia nó lên đến một cái gì đó tôi nhận thấy trong OP ("có một phương pháp prepended với một tràng") –

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