Перетворити рядок до символу в рубіні


241

Символи зазвичай представлені як такі

:book_author_title

але якщо у мене є рядок:

"Book Author Title"

чи є вбудований спосіб в рейках / рубіні, щоб перетворити його в символ, де я можу використовувати : позначення, не виконуючи лише заміни необробленого рядкового рядка?


Відповіді:


360

Рейки отримали ActiveSupport::CoreExtensions::String::Inflectionsмодуль, що забезпечує такі методи. Їх усіх варто подивитися. Для вашого прикладу:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title

це працює дуже добре! ви можете мати будь-які слова погода чи ні вони там, де з великої літери. Параметрize розібрає його.
TheLegend

чи є спосіб змінити це, не використовуючи gsub?
Зак

@Zack .to_sі .humanizeповинен виконувати цю роботу, якщо вам не потрібно зберегти повну капіталізацію.
Тайлер Діас

Хороший спосіб підйти до перетворення будь-чого - це можливість зробити та скасувати операцію. .to_sym може перетворити один напрямок (від рядка до символу), а .to_s може перетворити (з символу в рядок). і якщо ви маєте справу з масивом, розгляньте .map (&: to_sym) або .map (& to_s) для перетворення всіх елементів.
jasonleonhard

2
параметрize ('_'). to_sym трохи коротший, ніж parameterize.underscore.to_sym.
IAmNaN

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, але ця публікація відповідає на задане фактичне запитання.
Russ Bateman

2
Неправда, що "[ to_sym] також може використовуватися для створення символів, які не можна представити за допомогою: xxx notation". :'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.