Domanda

In Ruby, qual è la differenza tra {} e []?

{} sembra di essere utilizzato con entrambi i blocchi di codice e hash.

Sono [] solo per le matrici?

La documentazione non è molto chiaro.

È stato utile?

Soluzione

Dipende dal contesto:

  1. Quando in proprio, o l'assegnazione ad una variabile, [] crea le matrici, e {} crea un hash.ad es.

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] può essere ignorata come un metodo personalizzato, ed è generalmente utilizzato per recuperare le cose da hash (la libreria standard del set up [] come metodo di hash che è lo stesso fetch)
    C'è anche una convenzione che viene utilizzato come un metodo di classe allo stesso modo si potrebbe utilizzare un static Create metodo in C# o Java.ad es.

    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
    

    Vedere la Rubino Hash docs per che l'ultimo esempio.

  3. Questo è probabilmente il più difficile - {} è anche la sintassi per i blocchi, ma solo quando è passato a un metodo al di FUORI argomenti parens.

    Quando si richiama metodi senza parentesi, Ruby guarda dove metti le virgole per capire dove gli argomenti fine (dove parens sarebbe stata, se solo avessi digitato)

    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
    

Altri suggerimenti

Un altro, non è così evidente, l'utilizzo di [] è come un sinonimo per il Proc#chiamata di Metodo e di#chiamata.Questo potrebbe essere un po ' di confusione la prima volta che si incontrano.Credo che il razionale dietro di esso è che lo fa apparire più come una normale chiamata di funzione.

E. g.

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

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

In generale, siete sulla strada giusta.Così come hash, lo stile generale è che le parentesi graffe {} sono spesso utilizzati per blocchi che possono montare tutto su una riga, invece di utilizzare do/end su più righe.

Le parentesi quadre [] sono utilizzati come metodi di classe in un sacco di Ruby, tutte le classi, compresa la Stringa, BigNum, Dir e confusamente abbastanza, di Hash.Così:

Hash["key" => "value"]

è altrettanto valido come:

{ "key" => "value" }

Le parentesi quadre [ ] sono utilizzati per inizializzare gli array.La documentazione inizializzatore caso di [ ] è in

ri Array::[]

Le parentesi graffe { } sono utilizzati per inizializzare hash.La documentazione inizializzatore caso di { } è in

ri Hash::[]

Le parentesi quadre sono anche comunemente usato come un metodo in molti core ruby, tutte le classi, come Array, Hash, Stringa, e altri.

È possibile accedere a un elenco di tutte le classi che hanno metodo "[ ]" definito con

ri []

la maggior parte dei metodi, anche di una "[ ]=" il metodo che permette di assegnare le cose, per esempio:

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

Parentesi graffe può anche essere usato al posto di "fare ...fine" a blocchi, come "{ ...}".

Un altro caso in cui è possibile vedere le parentesi quadre o graffe parentesi utilizzato - è in particolare gli inizializzatori di qualsiasi simbolo può essere utilizzato come:

%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"

un paio di esempi:

[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

Nota che è possibile definire il [] metodo per le proprie classi:

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

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

end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top