Dúvida com sintaxe ao usar hashes ... ou oq eu acho que são hashes

2 respostas
FieroddPJ

Olá pessoal!
Estou seguindo o livro head first rails e em um dos capítulos me é apresentada a seguinte sintaxe
render :partial => 'subform', :locals => {:variable => @other_variable }

Já tinha me deparado com sintaxes parecidas nos capítulos anteriores mas até então fui seguindo em frente. Agora eu gostaria de entender realmente o que estou fazendo aqui pois até agora não consegui entender.

Minha dúvida não é em relação as variáveis ou aos símbolos e sim ao hash, pelo que entendi é assim que defino um hash:

mas se a sintaxe é essa, por que isso não está entre chaves?

pior ainda, por que não funciona quando eu adiciono as chaves?
e isso?

pra mim deveria ser um hash onde a chave é :locals e o valor é outro hash, mas se eu escrever dessa forma também não funciona ?

Não entendi essa construção, poderiam me explicar? já verifiquei o capítulo de hashes do livro ?The Ruby way? mas não consegui sanar minha dúvida.

Obrigado!

2 Respostas

ricardo.valeriano

Como vai FieroddPJ? Tudo em ordem?

Uma característica bastante marcante da linguagem Ruby são os "sintaxes sugares" prá todo lado. Assim como o parêntese é opcional na chamada ao método render do exemplo que você apresentou, as chaves também são opcionais para a criação de um hash:

h = Hash.new
h[:partial] = "subform"
h = { :partial => "subform" }
# ruby 1.9:
h = { partial: "subform" }

As três formas acima criam um hash com um símbolo ":partial" como chave e a string "subform" como valor.

Além disso, se um método receber um hash como último parâmetro, então as chaves são opcionais, veja esse exemplo:

def ultimo_sera_hash(a, b, hash)
  puts a
  puts b
  p hash
end

ultimo_sera_hash("1", "2", :partial => 'subform')

# o resultado da execução será:
1
2
{:partial=>"subform"}

Vale lembrar que, como os parênteses são opcionais para a invocação de um método, poderíamos usar a seguinte sintaxe:

ultimo_sera_hash "1", "2", :partial => 'subform'

O Rails usa bastante dessa possibilidade para oferecer métodos que recebem apenas um único parâmetro (logo, esse cara é o primeiro e último parâmetro do método). No caso do exemplo que você citou, o método render recebe um hash, com duas chaves: :partial apontando para uma string e :locals apontando para outro hash.

Ajudou? Qualquer dúvida é só dizer!

FieroddPJ

Entendi Ricardo, obrigado!
Os sintaxe suggars complicaram um pouco a minha vida …

Após a sua explicação testei essa sintaxe

Dessa forma funciona e faz sentido pra mim!

Vou seguir em frente no head first, mas é extremamente contra-intuitivo aprender rails (o framework) sem ter uma boa base de ruby (a linguagem), não farei isso novamente, fica a dica pra quem quiser começar a estudar RoR.

Mais uma vez obrigado!

Criado 21 de fevereiro de 2012
Ultima resposta 22 de fev. de 2012
Respostas 2
Participantes 2