Gần đây tôi đã gặp một số hành vi lạ với toán tử defined?
được sử dụng để kiểm tra xem từ khóa super
có thể được sử dụng trong ngữ cảnh hiện tại hay không. Thông thường nó hoạt động tốt, nhưng khi tôi cố gắng để kết hợp các kiểm tra defined? super
với một chút nhỏ của metaprogramming, nó đã cho tôi kết quả bất ngờ.Hành vi lạ được xác định? (Siêu) kiểm tra
Nó dễ dàng hơn để hiển thị sau đó để mô tả, vì vậy đây là một ví dụ cất để minh họa cho vấn đề:
class A;
def self.def_f!;
singleton_class.send(:define_method, :f) { defined? super }
end
end
class AA < A; end
(A
và AA
lớp cả hai đều có .def_f!
phương pháp lớp)
A.def_f!
A.f # => nil
AA.f # => nil
(A.f
không có siêu và AA.f
gửi tới A.f
, vì vậy mọi thứ vẫn ổn, nhưng ...)
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
Có ai có thể giải thích cho tôi dòng cuối cùng không? A.f
không có phương thức siêu, vậy tại sao nó trả về "super"
thay vì nil
? Nó là một lỗi?
(Tôi đã thử nó trong 1.9.2 và 1.9.3-cùng kết quả)
UPD: Tôi mở một vé trên bugtracker Ruby: http://bugs.ruby-lang.org/issues/6644
Sau khi xem các nguồn Ruby, tôi nghĩ bạn đã tìm thấy một lỗi thực sự ở đây. Bạn nên báo cáo nó với trình gỡ lỗi Ruby. –
Và nếu bạn làm như vậy, đừng quên đăng liên kết tới vấn đề ở đây! ':)' –
@NiklasB. Xong: http://bugs.ruby-lang.org/issues/6644 – Alexis