【问题标题】:Symbolize any non-digit in String (Ruby)符号化字符串中的任何非数字(Ruby)
【发布时间】:2012-11-23 01:44:11
【问题描述】:

我有以下字符串输出:

"[1, 2, 3, *, +, 4, 5, -, /]"

如何符号化非数字字符(即*、+、-、/)并返回以下结果:

[1, 2, 3, :*, :+, 4, 5, :-, :/]

目前,我正在使用这种方法来转换字符串:

def tokens(str)
    new_str = str.split(/\s+/)
    clean_str = new_str.to_s.gsub(/"/, '')
            #Symbolise clean_str to desired output
end

【问题讨论】:

    标签: ruby string symbols digits


    【解决方案1】:
    str = "[1, 2, 3, *, +, 4, 5, -, /]"
    
    str.scan(/[^\[\]\s,]+/)
    # => ["1", "2", "3", "*", "+", "4", "5", "-", "/"]
    
    str.scan(/[^\[\]\s,]+/).map {|t| Integer(t) rescue t.to_sym }
    # => [1, 2, 3, :*, :+, 4, 5, :-, :/]
    

    【讨论】:

      【解决方案2】:
      eval(str.gsub(/(?<=\[| )(?=\D)/, ":"))
      

      【讨论】:

      • 这个答案也有效,但我认为标记的答案更容易阅读。谢谢!
      【解决方案3】:

      如果当前字符串是数字,您可以创建返回 truefalse otherwise 的布尔方法。所以基本上,你可以这样做:

      class String
        def numeric?
          Float(self) != nil rescue false
        end
      end
      
      "3".numeric?
      #=> true
      "+".numeric?
      #=> false
      "a".numeric?
      #=> false
      "-3".numeric?
      #=> true
      

      然后,您可以遍历您的列表(例如通过each())并用:a 替换当前字符串(例如a),如果numeric? 在其上返回false。为此,您必须使用to_sym() 方法。

      可能有更快的方法可以做到这一点,但我认为 numeric?() 布尔函数非常漂亮。

      【讨论】:

      • 你真的不需要冲撞String 来获得想要的结果。不要因为如此琐碎的事情而鼓励这种做法。
      • @macek :“有不止一种方法可以做到这一点”。我用我的方法得到结果,你用一个块得到一个,太好了。这就是我喜欢 Ruby 的原因,你可以随心所欲。
      • 仅仅因为你能做到,并不意味着你应该这样做。这就是将 最佳 实践与... 非最佳 实践... 区分开来的原因
      • 这不是你的方法。您从here 复制/粘贴了它。下次请在您的答案中添加来源。
      • @Mischa :谢谢你的链接,不知道。伟大的思想似乎看起来很相似。看到这个帖子什么时候发布,我想我使用这个方法的时间比海报的时间长;)。但是,那是题外话。
      猜你喜欢
      • 2016-11-25
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2013-09-08
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多