2016-06-14 21 views
1

Ich habe die folgende Variable
Konstanten in Ruby und Java Schlüsselwort final

CONSTANT =5 

ich testen wollte, wie Konstanten in Ruby arbeiten und war überrascht, wie folgt zu ermitteln:

CONSTANT = 6 

. .results in CONSTANT wird tatsächlich mit einer Warnung überschrieben. Ich komme aus einem Java-Hintergrund, wo Konstanten genau das sind, konstant, also bin ich ein wenig verwirrt, wie Ruby Dinge erledigt.

Meine Frage ist, ob es eine Möglichkeit gibt, Javas endgültiges Schlüsselwort in Ruby nachzuahmen, so dass ein Benutzer den Wert einer Variablen nicht ändern kann?

+0

Ich glaube nicht, dass es in Ruby Äquivalente zu Java-Konstanten gibt. – Li357

+0

Reflection in Ruby ist mühelos und durchdringend, und es wäre nicht mehr Ruby ohne es; und es ist trivial, alle Zugriffssteuerungen zu ignorieren, die es verwenden. Es gibt auch keine Möglichkeit, Menschen daran zu hindern, Klassenstränge zu machen; def + (o); "NEIN!" Ende-Ende. Der Ruby-Weg ist: mach dich nicht dumm und dir geht es gut. – Amadan

Antwort

1

Wie viele Dinge in Ruby gibt es kein "Finale", die Dinge sind von Natur aus dynamisch und absolut verhindern, dass Menschen Dinge tun, wird nie wirklich passieren. Du kannst es nur schwer machen.

Das einzige, was zu beachten ist, in Ruby gibt es einen Unterschied zwischen unveränderlich und konstant. Eine Konstante ist eine Variable, die bei der Neuzuweisung eine Warnung generiert, das ist alles, und nichts hindert Sie daran, sie zu ändern. Um Änderungen zu verhindern, müssen Sie das betreffende Objekt "einfrieren", obwohl es sich bei allen Dingen in Ruby um eine Anfrage handelt, die vom Objekt ignoriert werden kann.

Normalerweise werden Sie Code wie folgt sehen:

ADMIN_USER_TYPE = 'Admin'.freeze 

Oder diese:

USER_TYPES = %w[ 
    Admin 
].freeze 

Der freeze Anruf Fälle zu fangen, wo die Liste könnte durch irgendein Verfahren zufällig verstümmelt werden. Es verhindert dies nicht unbedingt, es ist eher eine Sicherheitsmaßnahme. Betrachten Sie diesen Code:

def user_labels(types) 
    types.map! { |t| [ t, t.downcase.to_sym ] } 
end 

Hier ein falscher map! Aufruf die Wirkung von Umschreiben des ursprünglichen Arrays haben würde. In Fällen, in denen man es mit einem Wegwerf-Argumente ist ruft das ist in Ordnung:

user_labels(%w[ Admin Test ]) 

Wenn Sie die Konstante verwenden Sie es dauerhaft verändern werden, und das wird dazu führen, dass und über bekommen verändert über Jedes Mal, wenn es angerufen wird, entsteht ein Durcheinander. Der Merker freeze löst hier eine Warnung aus und verhindert dies.

Also die kurze Antwort ist: Nein. Die lange Antwort ist, dass Sie diszipliniert sein müssen, die Sprache wird Sie nicht davon abhalten, dies zu tun, wenn Sie ausreichend entschlossen sind. Warnungen beachten und ernst nehmen.