Frage Was bedeuten die verschiedenen Klammern in Ruby?


In Ruby, was ist 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.


76
2017-08-15 18:09


Ursprung


Antworten:


Es hängt vom Kontext ab:

  1. Wenn sie alleine sind oder einer Variablen zuweisen, [] erstellt Arrays und {} erstellt Hashes. z.B.

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] kann als benutzerdefinierte Methode überschrieben werden und wird im Allgemeinen zum Abrufen von Objekten aus Hashes verwendet (die Standardbibliothek richtet sich ein) [] als eine Methode auf Hashes, die das gleiche wie ist fetch)
    Es gibt auch eine Konvention, dass es als Klassenmethode verwendet wird, genauso wie Sie a static Create Methode in C # oder Java. 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
    

    Siehe Ruby Hash-Dokumente für das letzte Beispiel.

  3. Dies ist wahrscheinlich der schwierigste - {} ist auch Syntax für Blöcke, aber nur bei einer Methode außerhalb der Argumente Parens übergeben.

    Wenn Sie Methoden ohne Parens aufrufen, prüft Ruby, wohin Sie die Kommas setzen, um herauszufinden, wo die Argumente enden (wo die Parens gewesen wären, hätten Sie sie eingegeben).

    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
    

67
2017-08-17 21:17



Eine andere, nicht so offensichtliche Verwendung von [] ist ein Synonym für Proc # Call und Method # Call. Dies könnte ein wenig verwirrend sein, wenn Sie es zum ersten Mal sehen. Ich denke, der Grund dafür ist, dass es eher wie ein normaler Funktionsaufruf aussieht.

Z.B.

proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)

proc["World"]
meth["Hello",","," ", "World!", "\n"]

19
2018-04-02 15:47



Grob gesagt, Sie haben Recht. Der allgemeine Stil ist neben den Hashes die geschweifte Klammer {} werden oft für Blöcke verwendet, die alle auf eine Zeile passen, anstatt sie zu verwenden do/end über mehrere Zeilen.

Eckige Klammern [] werden als Klassenmethoden in vielen Ruby-Klassen verwendet, einschließlich String, BigNum, Dir und zum Verwechseln genug Hash. Damit:

Hash["key" => "value"]

ist genauso gültig wie:

{ "key" => "value" }

9
2017-08-15 18:24



Die eckigen Klammern [] werden verwendet, um Arrays zu initialisieren. Die Dokumentation für Initializer-Fall von [] ist in

ri Array::[]

Die geschweiften Klammern {} werden zum Initialisieren von Hashes verwendet. Die Dokumentation für Initialfall von {} ist in

ri Hash::[]

Die eckigen Klammern werden auch häufig als Methode in vielen Kern-Ruby-Klassen wie Array, Hash, String und anderen verwendet.

Sie können auf eine Liste aller Klassen zugreifen, für die die Methode "[]" definiert ist

ri []

Die meisten Methoden verfügen auch über eine Methode "[] =", mit der Dinge zugewiesen werden können, zum Beispiel:

s = "hello world"
s[2]     # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s        # => "hemlo world"

Curly Brackets können auch anstelle von "do ... end" auf Blöcken verwendet werden, wie "{...}".

Ein weiterer Fall, in dem Sie eckige Klammern oder geschweifte Klammern verwenden können, ist in den speziellen Initialisierungen, in denen jedes Symbol verwendet werden kann, wie:

%w{ hello world } # => ["hello","world"]
%w[ hello world ] # => ["hello","world"]
%r{ hello world } # => / hello world /
%r[ hello world ] # => / hello world /
%q{ hello world } # => "hello world"
%q[ hello world ] # => "hello world"
%q| hello world | # => "hello world"

3
2017-09-17 07:52



ein paar Beispiele:

[1, 2, 3].class
# => Array

[1, 2, 3][1]
# => 2

{ 1 => 2, 3 => 4 }.class
# => Hash

{ 1 => 2, 3 => 4 }[3]
# => 4

{ 1 + 2 }.class
# SyntaxError: compile error, odd number list for Hash

lambda { 1 + 2 }.class
# => Proc

lambda { 1 + 2 }.call
# => 3

2
2017-08-15 19:03



Beachten Sie, dass Sie das definieren können [] Methode für Ihre eigenen Klassen:

class A
 def [](position)
   # do something
 end

 def @rank.[]= key, val
    # define the instance[a] = b method
 end

end

2
2017-10-13 21:47