lớp_eval
Và instance_eval
Nó hoàn toàn có thể dự đoán được khi xác định các phương thức, v.v. Tôi cũng hiểu sự khác biệt giữa các thể hiện của một lớp và các phần tử đơn của một lớp (còn gọi là các lớp đặc điểm).
Nhưng
Điều duy nhất tôi không thể hiểu được là như sau: Giả sử, vì một số mục đích chính sách, chúng tôi muốn biến một lớp hiện có thành một lớp đơn.
cuối lớp A;
cuối lớp B;
A.class_eval làm
riêng tư :mới
end
B.instance_eval làm
riêng tư :mới
end
Trong cả hai trường hợp tôi đều nhận được
NameError: phương thức không xác định 'mới' cho lớp
Ý bạn là mới?
Vâng, đó chính là điều tôi muốn nói.
Hơn nữa, cả hai biến thể đều cho kết quả như nhau, giống như trong cả hai trường hợp self
tất cả đều trỏ tới các đối tượng của lớp
A.class_eval làm
lớp << bản thân
riêng tư :mới
end
end
A. mới
=> NoMethodError: phương thức riêng 'mới' được gọi cho A:Class
B.instance_eval làm
lớp << bản thân
riêng tư :mới
end
end
B.mới
=> NoMethodError: phương thức riêng 'mới' được gọi cho B:Class
Làm thế nào nó có thể được? Bất cứ ai có thể làm sáng tỏ điều này?
Hãy xem self là gì ở đây:
hạng A
đặt self.inspect
lớp << bản thân
đặt self.inspect
end
end
A.class_eval {
đặt self.inspect
lớp << bản thân
đặt self.inspect
end
}
A.instance_eval{
đặt self.inspect
lớp << bản thân
đặt self.inspect
end
}
Chúng tôi nhận được kết quả đầu ra sau:
MỘT
#
MỘT
#
MỘT
#
Phương thức class_eval được định nghĩa cho các mô-đun (và do đó là các lớp) và được đánh giá trong ngữ cảnh của mô-đun (lớp). Phương thức instance_eval được đánh giá trong ngữ cảnh của BasicObject. Trong những trường hợp này, hai (thực ra là ba) có vẻ giống nhau.
Tuy nhiên, tôi biết một thực tế là nếu phương thức nằm trong khối eval创建, thì class_eval sẽ tạo các phương thức cá thể và instance_eval sẽ tạo các phương thức lớp. Đã có một bài viết xuất sắc về quan sát này:
Tôi là một lập trình viên xuất sắc, rất giỏi!