Tôi đang chạy một số mã Ruby có thể xuất hiện một tệp Ruby mỗi khi ngày của nó thay đổi. Trong tệp, tôi có các định nghĩa liên tục, nhưLàm thế nào để xác định lại một hằng số Ruby mà không cần cảnh báo?
Tau = 2 * Pi
và tất nhiên, chúng làm cho thông báo không mong muốn "đã được khởi tạo" liên tục, vì vậy, tôi muốn có các chức năng sau:
def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)
tôi có thể tránh được những cảnh báo bằng cách viết tất cả các định nghĩa liên tục của tôi như thế này:
Tau = 2 * Pi unless defined?(Tau)
nhưng nó được hay cho lắm và một chút ẩm ướt (không DRY).
Có cách nào tốt hơn để def_if_not_defined
không? Và làm thế nào để redef_without_warning
?
-
Giải pháp nhờ Steve:
class Object
def def_if_not_defined(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.const_set(const, value) unless mod.const_defined?(const)
end
def redef_without_warning(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.send(:remove_const, const) if mod.const_defined?(const)
mod.const_set(const, value)
end
end
A = 1
redef_without_warning :A, 2
fail 'unit test' unless A == 2
module M
B = 10
redef_without_warning :B, 20
end
fail 'unit test' unless M::B == 20
-
Câu hỏi này là cũ. Đoạn mã trên chỉ cần thiết cho Ruby 1.8. Trong Ruby 1.9, câu trả lời của P3t3rU5 không tạo ra cảnh báo và chỉ đơn giản là tốt hơn.
Tại sao bạn muốn xác định lại một hằng số? Tốt hơn đối với hằng số không gian tên bằng cách giữ chúng trong các lớp hoặc mô-đun của riêng bạn - theo cách này, chúng sẽ không bao giờ xung đột với các hằng số khác. –
Tôi muốn xác định lại một hằng số vì tôi muốn sử dụng hằng số một cách tự nhiên như thể tôi không sử dụng trình tải lại mã nguồn tự động, vì vậy tôi sẽ không chấp nhận bất kỳ câu trả lời "không sử dụng hằng số" nào. –
Điều gì không phù hợp và không BIẾT về 'Tau = 2 * Pi trừ khi được định nghĩa? (Tàu)'? – jrdioko