Warum erzeugen die folgenden zwei Codefragmente nicht die gleiche Ausgabe? Der Unterschied zwischen push
und |=
ist ein schwieriger. Ich nehme an, dass |=
eine Aufgabe sein könnte einen Unterschied machen? Obendrein wären die Konstanten später auch sicher vor Veränderungen, schätze ich nicht? Der Code kommt von Antworten auf this question. Sie können es in action here sehen.Ruby-Klassenkonstanten und Vererbungsmysterium
class LibraryItem
ATTRIBUTES = ['title', 'authors', 'location']
end
class LibraryBook < LibraryItem
ATTRIBUTES.push('ISBN', 'pages']
end
puts LibraryItem::ATTRIBUTES
puts LibraryBook::ATTRIBUTES
> ["title", "authors", "location", "ISBN", "pages"]
> ["title", "authors", "location", "ISBN", "pages"]
und
class Foo
ATTRIBUTES = ['title','authors','location']
end
class Bar < Foo
ATTRIBUTES |= ['ISBN', 'pages']
end
puts Foo::ATTRIBUTES
puts Bar::ATTRIBUTES
> ["title", "authors", "location"]
> ["title", "authors", "location", "ISBN", "pages"]
Im ersten Beispiel bezieht sich "ATTRIBUTES" auf das ** selbe ** Array in beiden Fällen, und das Ändern an einer Stelle bedeutet, dass die anderen auch die Änderungen sehen. Im zweiten Fall erstellen Sie ein neues Array für "Bar", anstatt das gemeinsame zu ändern, was zu dem gewünschten Verhalten führt. –
Also ist es die Zuordnung, die den Unterschied macht?Das heißt, wenn meine Klasse unterklassifiziert wird, kann jede Unterklasse eine 'Konstante' ändern? – nus
Dieser Code wird nicht kompiliert. –