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

202

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

:book_author_title

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

"Book Author Title"

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

Теги:

6 ответов

310
Лучший ответ

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

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
  • 0
    это работает очень хорошо! Вы могли бы иметь любые слова о погоде или нет они, где они написаны с большой буквы. Параметризация разберутся.
  • 0
    Есть ли способ изменить это, не используя gsub?
Показать ещё 3 комментария
202

from: 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, но этот пост отвечает на фактически заданный вопрос.
Показать ещё 5 комментариев
21
"Book Author Title".parameterize('_').to_sym
=> :book_author_title

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

parameterize - это метод rails, и он позволяет вам выбрать то, что вы хотите, чтобы разделитель был. По умолчанию это тире "-".

  • 0
    спасибо параметризация с опцией помогла :)
11

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

"edition".intern # :edition

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

  • 0
    Как этот, так как мое решение string.to_sym выдает мне предупреждение безопасности :)
10

В Rails вы можете сделать это с помощью метода underscore:

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

Простейший код использует regex (работает с Ruby):

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

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

:"Book Author Title"

:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню