2013-08-13 4 views
7

Was ist der Unterschied zwischen Anhängen und Voranstellen eines Doppelpunkts in Ruby?Unterschied zwischen Voranstellen und Anhängen von Doppelpunkt (: item vs item :)

Beispiel:

#In rails you often have things like this: 
has_many :models, dependent: :destroy 

Warum dependent: haben einen anhängenden Doppelpunkt, aber :models und :destroy haben einen vorangestellten Doppelpunkt? Was ist der Unterschied?

+0

möglich duplicate of [Gibt es einen Unterschied zwischen dem \: key => "value" \ und key: "value" \ 'hash notations?] (Http://stackoverflow.com/questions/8675206)/is-there-any-difference-zwischen-dem-schlüsselwert-und-schlüsselwert-hash-no –

Antwort

9

Dies ist eine neue Syntax in Ruby 1.9 für Symbole definieren, die die Schlüssel in einem Hash sind.

Die beiden vorangestellten und angehängten : definieren eine symbol, aber letztere ist nur während der Initialisierung eines Hash gültig.

Sie können sich eine symbol als eine leichte String-Konstante vorstellen.

Er entspricht

:dependent => :destroy 

Vor 1,9, wurden Hashes mit einer Syntax definiert sind, die etwas ausführlicher und umständlich Typ:

hash = { 
    :key => "value", 
    :another_key => 4 
} 

Sie vereinfacht es in 1,9:

Wenn Sie jemals ein Modul geschrieben haben, das Sie auf Ruby vor 1.9 verwenden möchten, stellen Sie sicher, dass Sie uns haben e die ältere Syntax.

4

In beiden Fällen gibt der Doppelpunkt ein Symbol an, aber das Anhängen ist eine Abkürzung, wenn das Symbol ein Schlüssel in einem Hash ist.

dependent: :destroy 

ist die gleiche wie

:dependent => :destroy 
2

Der "angehängte" Doppelpunkt ist einfach die neue gebräuchliche Art, Hashes in 1.9 anzuzeigen.

dependent: :destroy ist das gleiche wie :dependent => :destroy

Auf der anderen Seite, ein „vorangestellt“ Doppelpunkt steht für eine Symboldaten in Ruby.

5

Da Rubin können Sie Klammern wegzulassen () und in einigen Fällen geschweiften Klammern {} es vielleicht nicht sehr offensichtlich, aber der obige Code sucht tatsächlich wie folgt aus:

has_many(:models, { dependent: :destroy })

Nun, bedeutet dies, dass has_many Nimmt zwei Argumente, eins ist ein Symbol :, eine unveränderliche Zeichenfolge, wenn Sie, und auch ein Hash, wo der dependent ist der Schlüssel und destroy ist der Wert; auch vielleicht als :dependent => destroy gesehen.