Конвертировать строку в символьную форму в 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

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


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. Это правильный ответ.
Катаржина



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


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}

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

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