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

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.


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


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.


:) 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.