Bir sabitin önceden tanımlanmış olup olmadığını kontrol edin


82

Umarım bu basittir. Aşağıdaki örnekte, bir sabitin önceden tanımlanmış olup olmadığını nasıl kontrol ederim?

#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)

Yanıtlar:


133
CONST = 2 unless defined? CONST

Harika operatör hakkında daha fazla bilgi için buraya bakın defined?.

PS Ve gelecekte var ||= 1bunun yerine isteyeceğinizi tahmin ediyorum var = var||1.


6
Ayrıca var const_defined?ama benim için çalışmıyor; emin değilim neden.
Jared Beck

8
const_defined?bir Modulesınıf metodudur ve sabitin o modülde ve onun atalarında (isteğe bağlı olarak) tanımlanıp tanımlanmadığını size söyleyecektir. Bazı örnekler için dokümanları kontrol edin - ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F
jibiel


Bu yanıt için teşekkürler .. || = Boole ile güvenilir bir şekilde kullanamamak için harika bir geçici çözüm
Chuck van der Linden

Bu sadece sabitler için değil, yöntemler için de harika çalışıyor.
Joshua Pinter

25

const_defined? API

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

1
Bu, özellikle dinamik bir şekilde tanımlanıp tanımlanmadığını kontrol ederken faydalıdır.
DickieBoy

4
CONST ||= :default_value

Yukarıdakiler benim için Ruby 1.9.3'te çalışıyor, ancak 1.8'de başarısız oluyor ... şimdi 1.8 eski.


:) 1.8 eski olabilir, ancak 2017'de hala kullanılıyor, örnek: Dreamhost paylaşılan barındırma.
manitu

Çoğu projenin Ruby 1.8 desteğini şimdiden bıraktığını görüyorum. Red Hat Enterprise Linux tarafından gönderilen Ruby 1.8 sürümlerinin hala "desteklenen" olduğunu biliyorum. Güvenlik yamaları alıyorlar, ancak bir tanesi hangi uygulamada yüklü olursa olsun kullanılan eski mücevher sürümlerinde birçok bilinmeyen güvenlik açığına maruz kalıyor. Yani evet, var ama çoğu insan için alakasız. Uzun süredir XP çalıştıran bilgisayarlar olduğu gibi (kısa süre önce yine böyle bir ATM tespit edildi).
akostadinov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.