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.


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.


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.


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)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.