Pergunta

Em Ruby, que é a diferença entre {} e []?

{} parece ser usados tanto para blocos de código e hashes.

São [] apenas para matrizes?

A documentação não é muito clara.

Foi útil?

Solução

Depende do contexto:

  1. Quando no seu próprio, ou atribuir a uma variável, [] cria matrizes, e {} cria hashes.exemplo:

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. [] pode ser substituído como um método personalizado, e é geralmente usado para buscar as coisas de hashes (a biblioteca padrão define [] como um método de hashes que é o mesmo que fetch)
    Há também uma convenção que é usado como um método de classe, da mesma forma você pode usar um static Create método em C# ou Java.exemplo:

    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
    

    Veja o Ruby Hash do google docs para esse último exemplo.

  3. Este é provavelmente o mais difícil - {} é também a sintaxe para os blocos, mas somente quando passados para um método de FORA os argumentos parens.

    Quando você invocar métodos sem parens, Ruby olha onde colocar as vírgulas para descobrir onde os argumentos final (onde o parens teria sido, se tivesse escrito)

    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
    

Outras dicas

Outro, não é tão óbvio, a utilização de [] é como um sinônimo para o Proc#chamada e o Método de chamada.Isso pode ser um pouco confuso a primeira vez que você encontrá-lo.Eu acho que o racional por trás dele é o que faz com que pareça mais como uma chamada de função normal.

E. g.

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

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

De modo geral, você está correto.Assim como os hashes, o estilo geral é de que as chaves {} são muitas vezes utilizados para os blocos que podem caber todos em uma linha, em vez de usar do/end através de várias linhas.

Colchetes [] são utilizados como métodos de classe em lotes de Ruby classes, incluindo a Cadeia, grande nī umero, Dir e confusamente o suficiente, de Hash.Assim:

Hash["key" => "value"]

é tão válido como:

{ "key" => "value" }

Os colchetes [ ] são usados para inicializar matrizes.A documentação para inicializador caso de [ ] em

ri Array::[]

As chaves { } são usadas para inicializar hashes.A documentação para inicializador caso de { } em

ri Hash::[]

Os colchetes são também comumente usado como um método em muitos núcleo ruby classes, como Array, Hash, Cadeia de caracteres, e outros.

Você pode acessar uma lista de todas as classes que possuem o método "[ ]" definidos com

ri []

a maioria dos métodos também têm um "[ ]=" método que permite atribuir coisas, por exemplo:

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

Chaves também pode ser usado em vez de "fazer ...end" em blocos, como "{ ...}".

Outro caso onde você pode ver colchetes ou parênteses usado - em especial os inicializadores de onde qualquer símbolo pode ser usado, como:

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

alguns exemplos:

[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

Observe que você pode definir o [] método para suas próprias classes:

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

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

end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top