Vì vậy, tôi đã có tình huống này, nơi tôi muốn xác định một loạt các lớp theo chương trình. Phương pháp tôi đang sử dụng bên dưới hoạt động tốt, ngoại trừ thực tế là lớp bên thứ ba mà tôi kế thừa từ đây không thích thực tế là lớp được định nghĩa ẩn danh (về cơ bản, nó không có thông tin cần thiết, tức là tên lớp, trong móc 'kế thừa', trước khi tôi có cơ hội thiết lập lớp ẩn danh thành hằng số).Định nghĩa lớp động với khối
['one', 'two', 'three'].each do |model|
cls = Class.new(ThirdPartyClass) do
define_method :model do
model
end
end
ThirdPartyClass.const_set(model.capitalize, cls)
end
tôi chỉ đơn giản có thể sử dụng một eval và xác định một cái gì đó lớp như:
['one', 'two', 'three'].each do |model|
eval "class ThirdPartyClass::#{model.capitalize} < ThirdPartyClass; ...; end"
end
nhưng tôi không thích nó vì sau đó nó lộn xộn chuỗi suy. Phương pháp dựa trên khối có vẻ 'đẹp hơn', về mặt thẩm mỹ.
Có cách nào tôi có thể định nghĩa lớp đó không ẩn danh (ví dụ: với tên ngay từ đầu) bằng cú pháp dựa trên khối hoặc tôi có phải ở trong vùng đầu vào chuỗi lộn xộn của eval không?
Thật lạ khi bạn muốn một lớp nằm trong không gian tên và là lớp con của cùng một lớp. – sawa
Đúng, nhưng điều không gian tên là trực giao cho vấn đề cụ thể này (ít nhất là tôi nghĩ vậy). Nếu bạn tò mò, tôi đang sử dụng gem classy_enum và theo quy ước của gem đó, các giá trị enum phải nằm trong không gian tên của lớp enum chính. Nó tạo ra một cú pháp enum hơi tương tự như trong các ngôn ngữ khác. – elsurudo