字符串转换为符号能够在Ruby中

问题描述:

符号通常表示为这样字符串转换为符号能够在Ruby中

:book_author_title 

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

"Book Author Title" 

有一个内置的方式在轨/红宝石转换它变成一个符号,我可以使用:表示法,而不只是做一个原始字符串正则表达式替换?

+0

而不是转换,哟你可能对[无关的访问 - 同时为字符串和符号参数工作的方法]感兴趣(http://*.com/questions/10780817)。 – 2013-06-12 04:07:16

的Rails得到ActiveSupport::CoreExtensions::String::Inflections模块,提供了这样的方法。他们都值得关注。对于你的例子:

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

这个工作真的很好!你可以有任何词汇天气或不是他们在哪里大写。参数化会将其整理出来。 – TheLegend 2012-04-18 14:00:04

+0

有什么办法可以反转这个,而不使用gsub? – Zack 2015-07-07 07:51:42

+0

@Zack'.to_s'和'.humanize'应该完成这项工作,除非你需要保留全部大写。 – 2015-09-18 10:00:01

在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 2012-04-18 13:57:51

来自: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

辉煌的例子。谢谢。 – Paul 2012-10-05 09:51:07

+7

原来的海报可能对Rails的答案感到满意,但这篇文章回答了实际提出的问题。 – 2013-09-24 21:01:43

+2

“['to_sym']”也可以用于创建无法用“xxx符号”表示的符号。 ':'猫和狗'与'猫和狗'.to_sym'相同。 – anthropomorphic 2013-12-09 09:38:56

"Book Author Title".parameterize('_').to_sym 
=> :book_author_title 

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

参数化是一个轨道的方法,它可以让你选择你想要的分隔符是什么。默认情况下它是“ - ”。

+0

感谢参数化与选项帮助:) – Francois 2013-05-21 11:23:35

这是你在找什么?:

:"Book Author Title" 

:)

实习生→符号 返回与str中的符号,创造了符号,如果它以前不存在

"edition".intern # :edition 

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

+0

像这一个,因为我的string.to_sym解决方案给我一个安全警告:) – 2015-06-24 11:47:34