【问题标题】:Convert string to symbol-able in ruby在ruby中将字符串转换为可符号
【发布时间】:2011-01-01 13:08:32
【问题描述】:

符号通常是这样表示的

:book_author_title

但如果我有一个字符串:

"Book Author Title"

rails/ruby 中是否有内置方法可以将其转换为符号,我可以在其中使用: 表示法,而无需执行原始字符串正则表达式替换?

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

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

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

【讨论】:

  • 这真的很好用!你可以有任何单词天气或不是他们大写的地方。参数化将解决它。
  • 有什么办法可以在不使用 gsub 的情况下扭转这种情况?
  • @Zack .to_s.humanize 应该可以完成这项工作,除非您需要保留全部大写。
  • 转换任何内容的好方法是能够执行和撤消操作。 .to_sym 可以转换一个方向(从字符串到符号),.to_s 可以转换(从符号到字符串)。如果您正在处理数组,请考虑使用 .map(&:to_sym) 或 .map(&to_s) 来转换所有元素。
  • parameterize('_').to_sym 比 parameterize.underscore.to_sym 短一点。
【解决方案2】:

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

应该去;)

【讨论】:

  • 出色的例子。谢谢。
  • 原始发帖人可能对 Rails 的回答很满意,但这篇文章回答了实际提出的问题。
  • “[to_sym] 也可用于创建无法使用 :xxx 表示法表示的符号”是不正确的。 :'cat and dog''cat and dog'.to_sym 相同。
  • 一个人甚至可以在不需要to_sym 的情况下做:"cat and dog\n on a new line" 这样古怪的事情。
  • 问题是关于 Ruby 中的转换,而不是 Rails。这是一个正确的答案。
【解决方案3】:
"Book Author Title".parameterize('_').to_sym
=> :book_author_title

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

parameterize 是一个 rails 方法,它可以让你选择你想要的分隔符。默认为破折号“-”。

【讨论】:

    【解决方案4】:

    实习生→符号 返回str对应的Symbol,如果之前不存在则创建该符号

    "edition".intern # :edition
    

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

    【讨论】:

    • 喜欢这个,因为我的 string.to_sym 解决方案给了我一个安全警告:)
    【解决方案5】:

    这是你要找的吗?:

    :"Book Author Title"
    

    :)

    【讨论】:

      【解决方案6】:

      在 Rails 中,您可以使用 underscore 方法:

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

      更简单的代码是使用正则表达式(适用于 Ruby):

      "Book Author Title".downcase.gsub(/\s+/, "_").to_sym
      => :book_author_title
      

      【讨论】:

      • 这只有在所有单词都以大写字母开头时才有效,如果是“my fat Dog”,它将返回:myfat_dog。
      【解决方案7】:

      这不是回答问题本身,但我发现这个问题正在寻找将字符串转换为符号并将其用于哈希的解决方案。

      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}
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        • 2013-01-28
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多