在Ruby中将字符串转换为可符号化


241

符号通常以此表示

:book_author_title

但是如果我有一个字符串:

"Book Author Title"

在rails / ruby​​中有一种内置方式将其转换为符号,我可以在: 不进行原始字符串regex替换的情况下使用该符号?


除了转换,您可能会对不同的访问方法感兴趣,这些访问方法对字符串和符号参数均有效
Boris Stitnicky 2013年

Answers:


360

Rails ActiveSupport::CoreExtensions::String::Inflections提供了提供此类方法的模块。他们都值得一看。例如:

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

这真的很好!您可能有任何天气字眼,也可能没有大写。参数化将对其进行整理。
TheLegend

有什么办法可以在不使用gsub的情况下扭转这种情况?
扎克2015年

@Zack .to_s.humanize应执行此工作,除非您需要保留全部大写。
泰勒·迪亚兹

转换任何内容的一种好方法是能够执行和撤消操作。.to_sym可以转换一个方向(从字符串到符号),. to_s可以转换(从符号到字符串)。如果要处理数组,请考虑使用.map(&:to_sym)或.map(&to_s)转换所有元素。
jasonleonhard 2015年

2
parameterize('_')。to_sym比parameterize.underscore.to_sym短一些。
IAmNaN

228

来自:http : //ruby-doc.org/core/classes/String.html#M000809

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

返回与对应的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表示法表示的符号是不正确的”。:'cat and dog'与相同'cat and dog'.to_sym
Michael Dorst 2013年

2
一个人甚至可以做那些:"cat and dog\n on a new line"不需要的奇特的事情to_sym
Michael Dorst 2013年

3
问题是关于Ruby而不是Rails的转换。这是正确的答案。
Katarzyna



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
仅当所有单词都以大写字母开头时,此命令才有效;如果它是“ my fat Dog”,它将返回:myfat_dog。
TheLegend 2012年


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}

希望它能帮助像我这样的人!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.