Question

En Ruby, quelle est la différence entre {} et []?

{} semble être utilisé à la fois pour les blocs de code et les hachages.

Sont [] uniquement pour les tableaux ?

La documentation n'est pas très claire.

Était-ce utile?

La solution

Ça dépend du contexte:

  1. Lorsqu'ils sont seuls ou attribués à 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 remplacé en tant que méthode personnalisée et est généralement utilisé pour récupérer des éléments à partir de hachages (la bibliothèque standard configure [] comme méthode sur les hachages qui est la même que fetch)
    Il existe également une convention selon laquelle elle est utilisée comme méthode de classe de la même manière que vous pourriez utiliser un static Create méthode 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 rubis Documents de hachage pour ce dernier exemple.

  3. C'est probablement le plus délicat -{} est également une syntaxe pour les blocs, mais uniquement lorsqu'elle est transmise à une méthode EN DEHORS des parenthèses d'arguments.

    Lorsque vous invoquez des méthodes sans parenthèses, Ruby regarde où vous placez les virgules pour déterminer où se terminent les arguments (où auraient été les parenthèses 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
    

Autres conseils

Une autre utilisation, pas si évidente, de [] est 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 la raison derrière cela est que cela ressemble davantage à un appel de fonction normal.

Par exemple.

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

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

D'une manière générale, vous avez raison.En plus des hachages, le style général est celui des accolades {} sont souvent utilisés pour des blocs qui peuvent tous tenir sur une seule ligne, au lieu d'utiliser do/end sur plusieurs lignes.

Crochets [] sont utilisées comme méthodes de classe dans de nombreuses classes Ruby, notamment String, BigNum, Dir et, ce qui prête à confusion, 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 d'initialisation de [ ] est dans

ri Array::[]

Les accolades { } sont utilisées pour initialiser les hachages.La documentation pour le cas d'initialisation de { } se trouve dans

ri Hash::[]

Les crochets sont également couramment utilisés comme méthode dans de nombreuses classes Ruby de base, comme Array, Hash, String et autres.

Vous pouvez accéder à une liste de toutes les classes dont la méthode "[ ]" est définie avec

ri []

la plupart des méthodes ont également une méthode "[ ]=" qui permet d'attribuer 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 « faire...end" sur les blocs, comme "{ ...}".

Un autre cas où vous pouvez voir des crochets ou des accolades utilisés est celui des initialiseurs 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"

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

Notez que vous pouvez définir le [] méthode pour vos propres cours :

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

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

end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top