Criar matriz de símbolos

130

Existe uma maneira mais limpa de fazer algo assim?

%w[address city state postal country].map(&:to_sym) 
#=> [:address, :city, :state, :postal, :country]

Eu teria imaginado %sque teria feito o que eu queria, mas não faz. Apenas pega tudo entre os colchetes e cria um grande símbolo.

Apenas um pequeno aborrecimento.

Desenhou
fonte
1
Isso é bastante padrão. Existe alguma coisa na sua implementação que torne esse método indesejável?
dwhalen 8/09/11
5
Não é "realmente", mas o Rails geralmente tem açúcar sintático como esse que me faz sentir um calor por dentro usando. :)
Desenhou
desde o ruby ​​2, existe! veja stackoverflow.com/questions/8816877/…
m_x

Respostas:

357

A resposta original foi escrita em setembro de 11, mas, a partir do Ruby 2.0 , existe uma maneira mais curta de criar uma matriz de símbolos! Este literal:

%i[address city state postal country]

fará exatamente o que você quiser.

Joost Baaij
fonte
3
Eu sempre esqueço que significa "intern" uma alternativa para "to_sym". Veja codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y
Observe a ênfase do ruby ​​2. Isso não é mostrado no livro Ruby Programming Language, porque abrange apenas 1.9.3.
Donato
Ao usar Ruby% literal sintaxe Eu prefiro usar dois caracteres não alfanuméricos no lugar de colchetes, ou seja%i|a b c|
Epigene
6
Enquanto isso faz o que você quer, quem vê isso na sua base de código terá que pesquisar no Google para descobrir qual sintaxe bizarra que Ruby lançou em nós neste momento. Eu recomendo evitar recursos obscuros de linguagem quando existirem alternativas perfeitamente legíveis, como [: endereço,: cidade,: estado].
Alex
Graças isso é realmente útil.
sonnyhe2002
91

Com o risco de se tornar literal demais, acho que a maneira mais limpa de construir uma matriz de símbolos é usando uma matriz de símbolos.

fields = [:address, :city, :state, :postal, :country]

Não consigo pensar em nada mais conciso do que isso.

Joost Baaij
fonte
11
Você quer dizer "literal demais"?
Andrew Grimm
Eu sempre gosto de encontrar e usar as formas mais poderosas e concisas de fazer as coisas. Essa resposta é, na verdade, menos pressionamentos de tecla que a minha para essa lista específica, mas com uma lista de ~ 9 ou mais itens, uma alternativa seria mais curta. Obrigado pela resposta. :)
Desenhou
4
Eu acho que a legibilidade supera tudo neste caso. Esta resposta é muito mais legível (IMO) do que a alternativa% w / to_sym. Não faça com que o próximo desenvolvedor que assuma o seu controle queira dar um soco na sua garganta.
Bruce Hubbard
3

%i[ ] Matriz não interpolada de símbolos, separados por espaço em branco (após o Ruby 2.0)

%I[ ] Matriz interpolada de símbolos, separada por espaço em branco (após Ruby 2.0)

%i[address city state postal country]

a maneira mais limpa de fazer isso é:

%w[address city state postal country].map(&:to_sym)

askrynnikov
fonte