Создать массив символов


131

Есть ли более чистый способ сделать что-то подобное?

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

Я бы подумал %s, сделал бы то, что хотел, но это не так. Он просто берет все, что находится в скобках, и делает из этого один большой символ.

Просто небольшое раздражение.


1
Это довольно стандартно. Есть ли что-нибудь в вашей реализации, что делает этот метод нежелательным?
dwhalen 08

5
Не «совсем», но в Rails часто есть синтаксический сахар, подобный этому, который заставляет меня чувствовать тепло внутри при использовании. :)
Дрю

поскольку рубин 2, есть! см. stackoverflow.com/questions/8816877/…
m_x

Ответы:


358

Первоначальный ответ был написан еще в сентябре 2011 года, но, начиная с Ruby 2.0 , существует более короткий способ создания массива символов! Этот буквальный:

%i[address city state postal country]

сделаю именно то, что вы хотите.


3
Я всегда забываю, что это означает «интерн», альтернативу «to_sym». См. Codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y

Обратите внимание на выделение ruby ​​2. Это не показано в книге по языку программирования Ruby, потому что это относится только к версии 1.9.3.
Донато

При использовании синтаксиса% literal в ruby ​​я предпочитаю использовать два не буквенно-цифровых символа вместо скобок, то есть%i|a b c|
Epigene

6
Хотя это делает то, что вы хотите, любой, кто увидит это в вашей кодовой базе, должен будет поискать в Google, чтобы выяснить, какой причудливый синтаксис Ruby нам бросил на этот раз. Я настоятельно рекомендую избегать использования неясных языковых функций, когда существуют хорошо читаемые альтернативы, например [: адрес,: город,: штат].
Alex

Спасибо, это действительно полезно.
sonnyhe2002,

91

Рискуя стать слишком буквальным, я думаю, что самый простой способ построить массив символов - это использовать массив символов.

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

Не могу придумать ничего более лаконичного, чем это.


11
Вы имеете в виду «слишком буквально»?
Эндрю Гримм

Мне всегда нравится находить и использовать наиболее эффективные и краткие способы решения задач. Этот ответ на самом деле содержит меньше нажатий клавиш, чем мой для этого конкретного списка, но со списком из ~ 9 или более элементов альтернатива будет короче. Спасибо за ответ. :)
Дрю

4
Я думаю, что в этом случае удобочитаемость важнее всего. Этот ответ НАМНОГО более читабелен (IMO), чем альтернатива% w / to_sym. Не заставляйте следующего разработчика, который возьмет на себя ваши дела, желание дать вам удар по горлу.
Брюс Хаббард

3

%i[ ] Неинтерполированный массив символов, разделенных пробелами (после Ruby 2.0)

%I[ ] Интерполированный массив символов, разделенных пробелами (после Ruby 2.0)

%i[address city state postal country]

Самый чистый способ сделать это:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.