84 votes

Que signifient les différentes parenthèses en Ruby ?

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.

70voto

Orion Edwards Points 54939

Cela dépend du contexte :

  1. 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
  2. [] 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.

  3. 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

21voto

sris Points 3040

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

9voto

John Topley Points 58789

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

3voto

Evgeny Points 1387

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"

2voto

James A. Rosen Points 25774

Quelques exemples :

[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

Prograide.com

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.

Powered by:

X