2011-10-04 9 views
11

Khi tôi gọi phương thức không tồn tại, method_missing sẽ cho tôi biết tên của phương thức. Khi tôi cố truy cập một biến chưa được đặt, giá trị chỉ đơn giản là nil.Ruby có một method_missing tương đương với các biến mẫu không xác định?

Tôi đang cố gắng tự động chặn truy cập vào các biến mẫu nil và trả về một giá trị dựa trên tên biến được truy cập. Tương đương gần nhất sẽ là __get của PHP. Có chức năng tương đương nào trong Ruby không?

+0

Bạn có biết về cảnh báo và cách bật chúng không? –

Trả lời

0

không có instance_variable_missing (ít nhất là tôi biết) Nhưng tại sao bạn lại truy cập các biến mẫu được đặt tên ngẫu nhiên?

Nếu chuỗi của bạn truy cập trạng thái đối tượng thông qua các cuộc gọi phương thức (như bạn vẫn làm) thì bạn sẽ không cần điều này.

Nếu bạn đang tìm cách xác định nội dung ma thuật mà không gây rối loạn với tra cứu phương pháp, bạn có thể muốn sử dụng const_missing.

+0

Các biến không được đặt tên ngẫu nhiên. Tôi đang chơi xung quanh bằng cách hiển thị một email mà không phải thông qua người gửi thư chịu trách nhiệm thiết lập các biến cá thể, cho mục đích thử nghiệm. Chế độ xem sẽ cố truy cập những thứ như '@ user.name' mà không có' @ user' được đặt. Tôi nghĩ rằng tôi có thể tự động tạo ra các đối tượng FactoryGirl cho những thứ như '@ user' trên lần đọc đầu tiên. – meagar

+0

Tôi thấy cảm ơn. AFAICT Tôi sợ lựa chọn duy nhất của bạn là đọc tệp mẫu và đặt các vars cho phù hợp (hoặc có thể biến vấn đề xung quanh và sử dụng 'method_missing' trong mẫu email của bạn). Đó là một sự xấu hổ kể từ khi ruby ​​thậm chí _knows_ khi bạn đang truy cập một biến không xác định và sẽ cung cấp cho bạn một cảnh báo. – riffraff

2

Tôi không tin điều này là có thể trong Ruby. Cách được đề xuất sẽ là sử dụng phương thức '' người dùng '' thay vì một biến thể '' @user '' trong mẫu của bạn.

Điều này phù hợp với cách bạn xử lý các đối tượng Ruby bên ngoài ('' obj.user '' là một phương thức dùng để chỉ '' @user '', nhưng thực sự không phải là '' @user ''). Nếu bạn cần bất kỳ loại logic đặc biệt nào với một thuộc tính, tốt nhất bạn nên sử dụng một phương thức (hoặc method_missing), bất kể bạn đang truy cập nó từ bên trong hay bên ngoài đối tượng.

1

Xem answer to another similar question của tôi. Nhưng chỉ vì bạn có thể làm điều đó không có nghĩa là đó là một ý tưởng hay. Thiết kế hợp lý nói chung có thể vượt qua sự cần thiết cho loại điều này và cho phép bạn sản xuất mã dễ đọc hơn và do đó có thể duy trì.

instance_variable_get có vẻ tương đương gần nhất với số __get của PHP từ những gì tôi có thể thấy (mặc dù tôi không phải là người dùng PHP).

Nhìn vào relevant Ruby source code, phương pháp 'thiếu' duy nhất cho các biến là const_missing cho các hằng số, không có gì cho các biến mẫu.

+1

Không hữu ích. Tôi sẽ phải biến tất cả các biến mẫu của tôi thành các lời gọi phương thức, điều này hoàn toàn không thực tế. – meagar

+0

Cũng không có cơ sở nào như vậy trong Ruby để truy cập các biến mẫu động ngoài những gì tôi đã mô tả trong câu trả lời khác. Xem câu trả lời được cập nhật ở trên. – arcresu