Was bedeutet Ruby-Konstante?

stimmen
4

Was bedeutet Ruby-Konstanten wirklich? Der folgende Code zeigt kein ‚constant‘ Attribut. Die Warnung ist da, aber ich habe immer noch zu ändern, was A bezieht.

A = 1
puts A # => 1
A = 2  # warning: already initialized constant A
puts A # => 2

Oder ist Ruby-Konstanten ohne Durchsetzung nur ein Hinweis sind?

Veröffentlicht am 30/12/2009 um 01:25
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
3

Das ist richtig - auf eine konstante Zuordnung ist eine Warnung, kein Fehler; „Konstanten“ sind nur ein Indikator dafür, wie man etwas, nicht eine Regel verwenden sollten, dass Sie es verwenden auf diese Weise.

Das mag horrend klingt aus einer statischen-Programmierung Welt kommen, aber es ist ungeheuer nützlich in verschiedenen metaprogramming Einrichtungen und ermöglicht Dinge, die sonst in statischen Sprachen völlig unmöglich wären.

Das heißt, wenn Sie wirklich sicher , die Leute halten ihre schmuddeligen Hände weg Ihre Referenzen machen möchten, können Sie verwenden Object#freeze. Es ist immer noch in Ordnung , was ein Referenzpunkt mit , dies zu ändern; können Sie den Inhalt der Referenz ändern sich:

irb(main):001:0> class Fruit; attr_accessor :name; end
=> nil
irb(main):002:0> f = Fruit.new
=> #<Fruit:0xb7e06570>
irb(main):003:0> f.name = "apple"
=> "apple"
irb(main):004:0> f.freeze                # After freeze, can't touch this Fruit.
=> #<Fruit:0xb7e06570 @name="apple">
irb(main):005:0> f.name = "banana"
TypeError: can't modify frozen object    # Kablammo!
    from (irb):5:in `name='
    from (irb):5

Aber das ist in Ordnung:

irb(main):006:0> f = Fruit.new
=> #<Fruit:0xb7dfed84>
irb(main):007:0> f.name = "banana"
=> "banana"
Beantwortet am 30/12/2009 um 01:27
quelle vom benutzer

stimmen
14

Das ist richtig, Konstanten sind ebenso wie Variablen in Ruby, aber Sie erhalten eine Warnung , wenn Sie sie ändern.

Außerdem gibt es einen Unterschied mit nur Variablen: Sie können Konstanten auch zugreifen, wenn sie innerhalb einer anderen Klasse oder ein Modul definiert ist, zum Beispiel dieser Schnipsel gegeben:

module Constants
  PI = 3,1415
  other = "variable"
end

Sie erreichen zu PItun , Constants::PIwährend Constants::othernicht funktionieren.

Beantwortet am 30/12/2009 um 01:28
quelle vom benutzer

stimmen
8

Ja, Ruby-Konstanten nicht erzwungen, andere als diese Warnung zu drucken.

Beantwortet am 30/12/2009 um 01:28
quelle vom benutzer

stimmen
2

„Constant“ ist wirklich eine falsche Bezeichnung, der wichtigste Aspekt von Rubys „Constants“ ist nicht ihre Unveränderlichkeit aber ihre Lookup-Regeln.

siehe: http://coderrr.wordpress.com/2008/03/11/constant-name-resolution-in-ruby/

Beantwortet am 30/12/2009 um 06:09
quelle vom benutzer

stimmen
0

Konstanten werden verwendet, um Werte zu speichern, die nicht geändert werden sollen. Ihre Namen müssen mit einem Großbuchstaben beginnen. Üblicherweise werden die meisten konstanten Namen werden in Großbuchstaben mit einem Unterstrich als Worttrenn, wie SOME_CONSTANT geschrieben.

Konstanten innerhalb von Klassen definiert sind, können nach allen Methoden der Klasse zugegriffen werden. Diejenigen, die außerhalb einer Klasse erstellt wurden, können global zugegriffen werden (innerhalb einer beliebigen Methode oder Klasse).

class Car
  WHEELS = 4

  def initialize
    puts WHEELS
  end
end

c = Car.new     # Output: 4

Beachten Sie, dass Ruby nicht, uns den Wert einer Konstante ändert nicht zu stoppen, es gibt nur eine Warnung aus.

SOME_CONSTANT = "foo"
SOME_CONSTANT = "bar"
warning: already initialized constant SOME_CONSTANT
warning: previous definition of SOME_CONSTANT was here

In Ruby, alle Klassen- und Modulnamen sind Konstanten, aber Konvention diktiert sollten sie in Kamel Fall geschrieben werden, wie Someclass.

Konstanten kann von außerhalb der Klasse zugegriffen werden, auch innerhalb einer anderen Klasse, durch den :: (Doppelpunkt) Operator. Auf die Räder zugreifen konstant von außerhalb der Auto-Klasse, würden wir Auto benutzen :: WHEELS. Die :: operator ermöglicht Konstanten, Methoden der öffentlichen Instanzmethoden und Klasse von außerhalb der Klasse oder des Moduls zugegriffen werden soll, auf der sie festgelegt sind.

Eine integrierte Methode namens private_constant macht Konstanten privaten (zugänglich nur innerhalb der Klasse, auf dem sie erstellt wurden). Die Syntax lautet wie folgt:

class Car
  WHEELS = 4

  private_constant:WHEELS
end

Car::WHEELS    # Output: NameError: private constant Car::WHEELS referenced
Beantwortet am 26/06/2016 um 18:36
quelle vom benutzer

stimmen
0

Wenn Sie von anderen Programmiersprachen sind kommen, behandelt Ruby-Konstanten anders als das, was Sie verwendet werden können. Konstanten in der Regel nehmen Werte, die durch die gesamte Anwendung nicht ändern. Die Syntax ist nur Großbuchstaben zu verwenden, während die Konstante Namensgebung, so dass die Anwendung weiß, wie man damit umgeht. Um zum Beispiel eine Konstante zu setzen ein Baseball-Team halten Sie es auf diese Weise erklären würden:

TEAM = "Angels"

Ich weiß, Sie wissen so viel, Bär mit mir hier. Typischerweise werden andere Programmiersprachen nicht zulassen, dass Sie den Wert von TEAM ändern. Allerdings ist Rubin nicht halten Sie zurück und nimmt den letzten Wert der Konstante zugeordnet. In dem obigen Beispiel kann ich seinen Wert ändern:

TEAM = "Athletics"

Andere Programmiersprachen würden entweder einen Fehler melden oder den Wert drucken würden Engel . Allerdings Rubin gibt den Wert Leichtathletik , weil das der letzte Wert der Variablen zugewiesen ist TEAM . Außerdem gibt es eine Warnmeldung , die besagt , dass die Konstante wurde bereits initialisiert und wurde geändert , weil eine konstante Veränderung eine schlechte Programmierpraxis angesehen wird. Aber es immer noch erlaubt Ihnen die Änderung vorzunehmen und folgt dem Ruby - Konvention der Entwickler von Vertrauen auf die richtige Programmierung Entscheidung zu treffen. Also, seien Sie vorsichtig bei den Konstanten in Ruby verwenden , da sie außer Kraft gesetzt werden können.

Beantwortet am 11/06/2018 um 12:55
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more