Überprüfen Sie, ob bereits eine Konstante definiert ist

82

Dies ist eine einfache, hoffe ich. Wie überprüfe ich im folgenden Beispiel, ob bereits eine Konstante definiert ist?

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

Antworten:

133
CONST = 2 unless defined? CONST

Sehen Sie hier für mehr über ehrfürchtige defined?Betreiber.

PS Und in Zukunft wirst du wohl var ||= 1stattdessen wollen var = var||1.

Jibiel
quelle
6
Es gibt auch, const_defined?aber es funktioniert nicht für mich; nicht sicher warum.
Jared Beck
8
const_defined?ist eine Methode der ModuleKlasse und zeigt an, ob die Konstante in diesem Modul und seinen Vorfahren (optional) definiert ist. Überprüfen Sie die Dokumente für einige Beispiele - ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F
Jibiel
Vielen Dank für diese Antwort. Tolle Problemumgehung, weil Sie || = nicht zuverlässig mit einem Booleschen Wert verwenden können
Chuck van der Linden
Dies funktioniert auch hervorragend für Methoden, nicht nur für Konstanten.
Joshua Pinter
25

const_defined? API

pry> User.const_defined?("PER_PAGE")
=> true
pry> User.const_defined?("PER_PAGE123")
=> false
Rusllonrails
quelle
1
Dies ist besonders hilfreich, wenn Sie überprüfen, ob dies dynamisch definiert ist.
DickieBoy
4
CONST ||= :default_value

Das obige funktioniert für mich auf Ruby 1.9.3, schlägt aber auf 1.8 fehl ... nun, 1.8 ist jetzt uralt.

akostadinov
quelle
:) 1.8 mag uralt sein, wird aber 2017 noch verwendet, Beispiel: Dreamhost Shared Hosting.
Kitschmaster
Ich sehe, dass die meisten Projekte die Unterstützung für Ruby 1.8 bereits eingestellt haben. Ich weiß, dass es immer noch "unterstützte" Ruby 1.8-Versionen gibt, z. B. von Red Hat Enterprise Linux. Sie erhalten Sicherheitspatches, aber man ist vielen unbekannten Sicherheitslücken in alten Gem-Versionen ausgesetzt, die in jeder installierten Anwendung verwendet werden. Also ja, das gibt es, aber es ist für die meisten Menschen irrelevant. Wie es Computer gibt und noch lange geben wird, auf denen XP läuft (erst kürzlich wurde wieder ein solcher Geldautomat entdeckt).
Akostadinov