Kiểm tra xem một hằng số đã được xác định chưa


82

Đây là một trong những đơn giản, tôi hy vọng. Làm cách nào để kiểm tra, trong ví dụ sau, nếu một hằng số đã được xác định?

#this works
var = var||1
puts var
var = var||2
puts var

#this doesn't
CONST = CONST||1
puts CONST
CONST = CONST||2
puts CONST

=> 1
   1
   uninitialized constant CONST (NameError)

Câu trả lời:


133
CONST = 2 unless defined? CONST

Xem ở đây để biết thêm về defined?nhà điều hành tuyệt vời .

Tái bút Và trong tương lai, tôi đoán bạn sẽ muốn var ||= 1thay vì var = var||1.


6
Cũng có const_defined?nhưng nó không hiệu quả với tôi; không chắc chắn lý do tại sao.
Jared Beck

8
const_defined?là một phương thức của Modulelớp và nó sẽ cho bạn biết liệu hằng được định nghĩa trong mô-đun đó và tổ tiên của nó (tùy chọn). Kiểm tra các tài liệu cho một số ví dụ - ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F
jibiel


Cảm ơn cho câu trả lời này .. workaround tuyệt vời cho việc không thể sử dụng || = đáng tin cậy với một boolean
Chuck van der Linden

Điều này cũng hoạt động tốt cho các phương thức, không chỉ các hằng số.
Joshua Pinter

25

const_defined? API

pry> User.const_defined?("PER_PAGE")
=> true
pry> User.const_defined?("PER_PAGE123")
=> false

1
Điều này đặc biệt hữu ích khi bạn đang kiểm tra xem điều này có được xác định theo cách động hay không.
DickieBoy

4
CONST ||= :default_value

ở trên hoạt động cho tôi trên ruby ​​1.9.3 nhưng không thành công trên 1.8 ... cũng 1.8 là cổ xưa bây giờ.


:) 1.8 có thể là cũ, nhưng vẫn được sử dụng trong năm 2017, ví dụ: Dreamhost shared hosting.
manitu

Tôi thấy hầu hết các dự án đã bỏ hỗ trợ cho ruby ​​1.8. Tôi biết rằng vẫn có các phiên bản ruby ​​1.8 "được hỗ trợ", ví dụ như được vận chuyển bởi Red Hat Enterprise Linux. Họ đang nhận được các bản vá bảo mật nhưng một bản vá cho thấy nhiều lỗi bảo mật không xác định trong các phiên bản đá quý cũ được sử dụng trong bất kỳ ứng dụng nào được cài đặt. Vì vậy, có, có, nhưng không liên quan đối với hầu hết mọi người. Giống như đã có và sẽ có một thời gian dài máy tính chạy XP (vừa mới phát hiện lại một máy ATM như vậy).
akostadinov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.