Tôi đang học lập trình meta trong Ruby và tôi đang thử xác định phương thức còn thiếu thông qua phương thức method_missing và define_method. Tôi nhận được một số hành vi bất ngờ và tự hỏi liệu có ai có thể giải thích điều này không. Đây là lớp học của tôi:Ruby: tại sao lại gọi to_ary?
class X
def method_missing(m, *args, &block)
puts "method #{m} not found. Defining it."
self.class.send :define_method, m do
puts "hi from method #{m}"
end
puts "defined method #{m}"
end
end
Bây giờ, mã này:
x = X.new
x.some_method
puts
x.some_method
puts
puts x
Tạo đầu ra:
method some_method not found. Defining it.
defined method some_method
hi from method some_method
method to_ary not found. Defining it.
defined method to_ary
#<X:0x007fcbc38e5030>
Những gì tôi không nhận được là phần cuối cùng: tại sao của Ruby gọi to_ary trong một cuộc gọi để đặt? Tại sao Ruby cố chuyển đổi đối tượng của tôi thành một mảng chỉ để in nó?
Tôi đã google xung quanh và tìm thấy những liên kết liên quan:
- http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
- http://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/
Đây cũng nói về method_missing và to_ary gotchas, nhưng không cụ thể về lý do tại sao puts sẽ gọi to_ary .
Tôi cũng nên đề cập rằng hành vi không thay đổi khi tôi xác định một to_s, ví dụ:
def to_s
"I'm an instance of X"
end
Kết quả của "puts x" là sau đó:
method to_ary not found. Defining it.
defined method to_ary
I'm an instance of X
Cảm ơn. Tôi nghĩ rằng bản chất là "to_ary sử dụng nội bộ thực sự là không tài liệu trong tài liệu Ruby" :) Tôi chỉ cần đọc các tài liệu IO.puts, họ không đề cập đến to_ary rõ ràng, điều này nên được rõ ràng hơn tôi nghĩ. Cảm ơn bạn đã trỏ đến cuốn sách "Ngôn ngữ lập trình Ruby", có thể kiểm tra điều đó. –