Was ist in Ruby der Unterschied zwischen {}
und []
?
{}
scheint sowohl für Codeblöcke als auch für Hashes verwendet zu werden.
Sind []
nur für Arrays?
Die Dokumentation ist nicht sehr klar.
Es kommt auf den Kontext an:
Wenn Sie alleine oder einer Variablen []
zugewiesen sind, werden Arrays und {}
Hashes erstellt. z.B
a = [1,2,3] # an array
b = {1 => 2} # a hash
[]
kann als benutzerdefinierte Methode überschrieben werden und wird im Allgemeinen zum Abrufen von Objekten aus Hashes verwendet (die Standardbibliothek wird []
als Methode für Hashes eingerichtet, die mit identisch ist fetch
).
Es gibt auch eine Konvention, dass sie in derselben als Klassenmethode verwendet wird So können Sie eine static Create
Methode in C # oder Java verwenden. z.B
a = {1 => 2} # create a hash for example
puts a[1] # same as a.fetch(1), will print 2
Hash[1,2,3,4] # this is a custom class method which creates a new hash
Das letzte Beispiel finden Sie in den Ruby Hash-Dokumenten .
Dies ist wahrscheinlich die schwierigste -
{}
ist auch eine Syntax für Blöcke, jedoch nur, wenn sie an eine Methode AUSSERHALB der Argumente parens übergeben wird.
Wenn Sie Methoden ohne Parens aufrufen, überprüft Ruby, wo Sie die Kommas setzen, um herauszufinden, wo die Argumente enden (wo die Parens gewesen wären, wenn Sie sie eingegeben hätten).
1.upto(2) { puts 'hello' } # it's a block
1.upto 2 { puts 'hello' } # syntax error, ruby can't figure out where the function args end
1.upto 2, { puts 'hello' } # the comma means "argument", so ruby sees it as a hash - this won't work because puts 'hello' isn't a valid hash
:c
nicht gefundenEine andere, nicht so offensichtliche Verwendung von
[]
ist als Synonym für Proc # call und Method # call. Dies kann beim ersten Auftreten etwas verwirrend sein. Ich denke, das Rationale dahinter ist, dass es eher wie ein normaler Funktionsaufruf aussieht.Z.B
quelle
Im Großen und Ganzen haben Sie Recht. Neben Hashes besteht der allgemeine Stil darin, dass geschweifte Klammern
{}
häufig für Blöcke verwendet werden, die alle auf eine Zeile passen, anstattdo
/end
über mehrere Zeilen hinweg zu verwenden.Eckige Klammern
[]
werden in vielen Ruby-Klassen als Klassenmethoden verwendet, einschließlich String, BigNum, Dir und verwirrenderweise Hash. So:ist genauso gültig wie:
quelle
Die eckigen Klammern [] werden zum Initialisieren von Arrays verwendet. Die Dokumentation zum Initialisierungsfall von [] befindet sich in
Die geschweiften Klammern {} werden zum Initialisieren von Hashes verwendet. Die Dokumentation zum Initialisierungsfall von {} befindet sich in
Die eckigen Klammern werden auch häufig als Methode in vielen Ruby-Kernklassen wie Array, Hash, String und anderen verwendet.
Sie können auf eine Liste aller Klassen zugreifen, für die die Methode "[]" definiert ist
Die meisten Methoden haben auch eine "[] =" - Methode, mit der Dinge zugewiesen werden können, zum Beispiel:
Geschweifte Klammern können auch anstelle von "do ... end" für Blöcke als "{...}" verwendet werden.
Ein weiterer Fall, in dem Sie eckige oder geschweifte Klammern sehen können, sind die speziellen Initialisierer, in denen jedes Symbol verwendet werden kann, z.
quelle
einige Beispiele:
quelle
Beachten Sie, dass Sie die
[]
Methode für Ihre eigenen Klassen definieren können:quelle
@rank.
?