O que os diferentes suportes em Ruby significa?
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.
Solução
Depende do contexto:
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
[]
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 quefetch
)
Há também uma convenção que é usado como um método de classe, da mesma forma você pode usar umstatic 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.
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