En Ruby, quelle est la différence entre {}
y []
?
{}
semble être utilisé à la fois pour les blocs de code et les hachages.
Sont []
seulement pour les tableaux ?
La documentation n'est pas très claire.
En Ruby, quelle est la différence entre {}
y []
?
{}
semble être utilisé à la fois pour les blocs de code et les hachages.
Sont []
seulement pour les tableaux ?
La documentation n'est pas très claire.
Cela dépend du contexte :
Lorsqu'elles sont seules, ou lorsqu'elles sont affectées à une variable, []
crée des tableaux, et {}
crée des hachages. Par exemple
a = [1,2,3] # an array
b = {1 => 2} # a hash
[]
peut être surchargée en tant que méthode personnalisée, et est généralement utilisée pour récupérer des éléments à partir de hachages (la bibliothèque standard met en place la méthode []
comme une méthode sur les hachages, ce qui est identique à fetch
)
Il existe également une convention selon laquelle elle est utilisée comme une méthode de classe de la même manière que vous pouvez utiliser une méthode static Create
en C# ou Java, par exemple.
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
Voir le Ruby Documentation sur les hachages pour ce dernier exemple.
C'est probablement le plus délicat - {}
est également une syntaxe pour les blocs, mais uniquement lorsqu'elle est passée à une méthode SANS les parenthèses des arguments.
Lorsque vous invoquez des méthodes sans virgules, Ruby regarde où vous avez placé les virgules pour savoir où se terminent les arguments (où les virgules auraient été, si vous les aviez tapées).
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
Une autre utilisation, pas si évidente, de []
est un synonyme de Proc#call et Method#call. Cela peut être un peu déroutant la première fois que vous le rencontrez. Je suppose que le raisonnement derrière cela est que cela ressemble plus à un appel de fonction normal.
Par exemple
proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)
proc["World"]
meth["Hello",","," ", "World!", "\n"]
En gros, vous avez raison. En plus des hachages, le style général est que les accolades {}
sont souvent utilisés pour les blocs qui peuvent tenir sur une seule ligne, au lieu d'utiliser la fonction do
/ end
sur plusieurs lignes.
Crochets []
sont utilisées comme méthodes de classe dans de nombreuses classes Ruby, notamment String, BigNum, Dir et, de façon assez déroutante, Hash. Donc :
Hash["key" => "value"]
est tout aussi valable que :
{ "key" => "value" }
Les crochets [ ] sont utilisés pour initialiser les tableaux. La documentation pour le cas de l'initialisation de [ ] est dans
ri Array::[]
Les accolades { } sont utilisées pour initialiser les hachages. La documentation pour le cas d'initialisation de { } est dans
ri Hash::[]
Les crochets sont aussi couramment utilisés comme méthode dans de nombreuses classes de base de ruby, comme Array, Hash, String, et autres.
Vous pouvez accéder à une liste de toutes les classes qui ont une méthode "[ ]" définie avec
ri []
La plupart des méthodes ont également une méthode "[ ]=" qui permet d'assigner des choses, par exemple :
s = "hello world"
s[2] # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s # => "hemlo world"
Les accolades peuvent également être utilisées à la place de "do ... end" sur les blocs, comme "{ ... }".
Un autre cas où vous pouvez voir des crochets ou des accolades utilisés - est dans les initialisateurs spéciaux où n'importe quel symbole peut être utilisé, comme :
%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"
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.