【发布时间】:2011-01-01 13:08:32
【问题描述】:
符号通常是这样表示的
:book_author_title
但如果我有一个字符串:
"Book Author Title"
rails/ruby 中是否有内置方法可以将其转换为符号,我可以在其中使用: 表示法,而无需执行原始字符串正则表达式替换?
【问题讨论】:
标签: ruby-on-rails ruby
符号通常是这样表示的
:book_author_title
但如果我有一个字符串:
"Book Author Title"
rails/ruby 中是否有内置方法可以将其转换为符号,我可以在其中使用: 表示法,而无需执行原始字符串正则表达式替换?
【问题讨论】:
标签: ruby-on-rails ruby
Rails 获得了提供此类方法的 ActiveSupport::CoreExtensions::String::Inflections 模块。他们都值得一看。以您为例:
'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
【讨论】:
.to_s 和 .humanize 应该可以完成这项工作,除非您需要保留全部大写。
来自: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
应该去;)
【讨论】:
to_sym] 也可用于创建无法使用 :xxx 表示法表示的符号”是不正确的。 :'cat and dog' 与 'cat and dog'.to_sym 相同。
to_sym 的情况下做:"cat and dog\n on a new line" 这样古怪的事情。
"Book Author Title".parameterize('_').to_sym
=> :book_author_title
http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize
parameterize 是一个 rails 方法,它可以让你选择你想要的分隔符。默认为破折号“-”。
【讨论】:
实习生→符号 返回str对应的Symbol,如果之前不存在则创建该符号
"edition".intern # :edition
【讨论】:
这是你要找的吗?:
:"Book Author Title"
:)
【讨论】:
在 Rails 中,您可以使用 underscore 方法:
"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title
更简单的代码是使用正则表达式(适用于 Ruby):
"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
【讨论】:
这不是回答问题本身,但我发现这个问题正在寻找将字符串转换为符号并将其用于哈希的解决方案。
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}
希望它能帮助像我这样的人!
【讨论】: