Về mặt kỹ thuật, @ndn đúng, nó có thể được gọi sau khi lớp đã được đánh giá. Tuy nhiên, có vẻ như bạn muốn xác nhận rằng phương thức cấu hình đã được gọi ở một số điểm trong định nghĩa lớp cơ thể (điều này cũng sẽ cho phép bất kỳ mô-đun nào được bao gồm, kết thúc đánh giá, vì vậy nếu một mô-đun bao gồm các cuộc gọi cấu hình phương pháp, tất cả đều tốt).
Giải pháp gần nhất tôi đã đưa ra để giải quyết tình trạng này có thể được tìm thấy ở đây:
https://github.com/jasonayre/trax_core/blob/master/lib/trax/core/abstract_methods.rb
Đoạn mã trên là một thực hiện phương pháp trừu tượng cho ruby, mà về mặt kỹ thuật không phải là những gì bạn đang hỏi (bạn đang nói về việc gọi phương thức, các phương thức trừu tượng là về việc kiểm tra xem một lớp con đã định nghĩa nó chưa), nhưng cùng một mẹo mà tôi đã sử dụng ở đó có thể được áp dụng. Về cơ bản, tôi đang sử dụng thư viện điểm dấu vết của ruby để xem kết thúc định nghĩa lớp để đánh, lúc đó nó kích hoạt một sự kiện, tôi kiểm tra xem phương thức đã được xác định chưa, và ném một lỗi nếu không. Vì vậy, miễn là bạn đang gọi cấu hình từ WITHIN các lớp học của bạn, một giải pháp tương tự có thể làm việc cho bạn. Một cái gì đó tương tự (không kiểm tra):
module MustConfigure
extend ::ActiveSupport::Concern
module ClassMethods
def inherited(subklass)
super(subklass)
subklass.class_attribute :_configured_was_called
subklass._configured_was_called = false
trace = ::TracePoint.new(:end) do |tracepoint|
if tracepoint.self == subklass #modules also trace end we only care about the class end
trace.disable
raise NotImplementedError.new("Must call configure") unless subklass._configured_was_called
end
end
trace.enable
subklass
end
def configure(&block)
self._configured_was_called = true
#do your thing
end
end
end
class A
include MustConfigure
end
class B < A
configure do
#dowhatever
end
end
class C < B
#will blow up here
end
Hoặc, bạn có thể thử sử dụng các mô-đun InheritanceHooks từ thư viện của tôi và bỏ qua việc xử lý tracepoint dẫn sử dụng:
class BaseClass
include::Trax::Core::InheritanceHooks
after_inherited do
raise NotImplementedError unless self._configure_was_called
end
end
Lưu ý, mặc dù tôi đang sử dụng mô hình này trong sản xuất tại thời điểm này, và mọi thứ hoạt động tốt trên MRI, bởi vì tracepoint là một thư viện được xây dựng để gỡ lỗi, có một số hạn chế khi sử dụng jruby. (ngay bây giờ nó phá vỡ trừ khi bạn vượt qua cờ gỡ lỗi jruby) - Tôi đã mở một vấn đề một lúc trở lại cố gắng để có được tracepoint thêm vào mà không cần phải kích hoạt gỡ lỗi một cách rõ ràng.
https://github.com/jruby/jruby/issues/3096
Khi nào ngoại lệ nên được ném? Khi quá trình này thoát? Làm thế nào bạn có thể biết rằng nó sẽ không được gọi là một thời gian trong tương lai? – ndn
Trường hợp ngoại lệ phải được ném, khi lớp B được xác định. Nhưng bạn có một điểm với * Làm thế nào bạn có thể biết rằng nó sẽ không được gọi là một thời gian trong tương lai? * – 23tux
Một lớp học có thể được mở cửa trở lại.Một mô-đun có thể được bao gồm sau khi một lớp được định nghĩa. – ndn