Конвертировать строку в символьную форму в ruby

241

Символы обычно представлены как таковые

:book_author_title

но если у меня есть строка:

"Book Author Title"

есть ли встроенный способ в rails / ruby, чтобы преобразовать его в символ, где я могу использовать : нотацию, не просто заменяя необработанное регулярное выражение?

Кристофер
источник
Вместо преобразования вас может заинтересовать равнодушный доступ - методы, работающие одинаково для строковых и символьных параметров .
Борис Ститницкий,

Ответы:

361

Rails получил ActiveSupport::CoreExtensions::String::Inflectionsмодуль, который предоставляет такие методы. На них все стоит посмотреть. Для вашего примера:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Прийт
источник
это работает очень хорошо! Вы могли бы иметь любые слова о погоде или нет они, где они написаны с большой буквы. Параметризация разберутся.
TheLegend
Есть ли способ изменить это, не используя gsub?
Зак
@ Зак .to_sи .humanizeдолжен делать работу, если вам не нужно сохранить полную капитализацию.
Тайлер Диаз,
Хороший способ приблизиться к преобразованию чего-либо - это уметь делать и отменять операции. .to_sym может преобразовывать одно направление (из строки в символ), а .to_s может преобразовывать (из символа в строку). и если вы имеете дело с массивом, рассмотрите .map (&: to_sym) или .map (& to_s) для преобразования всех элементов.
Jasonleonhard
2
Параметризация ('_'). to_sym немного короче, чем параметрizeize.underscore.to_sym.
ИАМНАН
228

от: http://ruby-doc.org/core/classes/String.html#M000809

str.intern => symbol
str.to_sym => symbol

Возвращает Символ, соответствующий str, создавая символ, если он не существовал ранее. См Symbol#id2name.

"Koala".intern         #=> :Koala
s = 'cat'.to_sym       #=> :cat
s == :cat              #=> true
s = '@cat'.to_sym      #=> :@cat
s == :@cat             #=> true

Это также может быть использовано для создания символов, которые не могут быть представлены с использованием :xxxнотации.

'cat and dog'.to_sym   #=> :"cat and dog"

Но для вашего примера ...

"Book Author Title".gsub(/\s+/, "_").downcase.to_sym

должны идти ;)

zzeroo
источник
1
Блестящие примеры. Спасибо.
Пол
8
Оригинальный постер, возможно, был доволен ответом Rails, но этот пост отвечает на фактически заданный вопрос.
Расс Бейтман
2
Неверно, что «[ to_sym] также может использоваться для создания символов, которые не могут быть представлены с использованием нотации: xxx». :'cat and dog'так же, как 'cat and dog'.to_sym.
Майкл Дорст
2
Можно даже делать такие диковинные вещи, как :"cat and dog\n on a new line"без необходимости to_sym.
Майкл Дорст
3
Речь шла о преобразовании в Ruby, а не в Rails. Это правильный ответ.
Катаржина
14

intern → symbol Возвращает символ, соответствующий str, создавая символ, если он ранее не существовал

"edition".intern # :edition

http://ruby-doc.org/core-2.1.0/String.html#method-i-intern

Хулио Маринс
источник
Как этот, так как мое решение string.to_sym предупреждает меня о безопасности :)
Денни Мюллер,
11

В Rails вы можете сделать это, используя underscoreметод:

"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title

Более простой код использует регулярные выражения (работает с Ruby):

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Чандра Патни
источник
3
это будет работать только в том случае, если все слова начинаются с заглавной буквы, если это был «мой толстый пёс», он вернется: myfat_dog.
TheLegend
9

Это то, что вы ищете?

:"Book Author Title"

:)

Кай Стинчкомб
источник
1

Это не отвечает на сам вопрос, но я нашел этот вопрос в поисках решения для преобразования строки в символ и использования ее в хэше.

hsh = Hash.new
str_to_symbol = "Book Author Title".downcase.gsub(/\s+/, "_").to_sym
hsh[str_to_symbol] = 10
p hsh
# => {book_author_title: 10}

Надеюсь, это поможет кому-то, как я!

Фабио Араужо
источник