Cosa sono le fasce diverse in Ruby dire?
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.
Soluzione
Dipende dal contesto:
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
[]
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 stessofetch
)
C'è anche una convenzione che viene utilizzato come un metodo di classe allo stesso modo si potrebbe utilizzare unstatic 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.
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