【问题标题】:Convert string to keyword将字符串转换为关键字
【发布时间】:2011-10-06 13:30:27
【问题描述】:

我们可以轻松地将关键字转换为字符串:

true.to_s
=> "true"

但是如何将字符串转化为关键字呢?

【问题讨论】:

  • 我正在使用 Cucumber,我将“true”作为块参数传递。能够获得真正的关键字会很高兴。
  • 谢谢博丹。我只是认为能够编写如下内容会很好:Fabricate :my_model, :correct => true_string.to_keyword ...其中 :correct 属性是布尔类型。

标签: ruby parsing keyword


【解决方案1】:

您有多少个关键字?您对“关键字”的定义是什么?

我会使用 case-command 来实现。您可以为 String 定义一个to_keyword 方法。我的实现检测 true、false、nil(或 NULL)。检测到字符串,忽略大写(TRUE 也将是true) 其他字符串将返回一个符号(字符串本身将是另一个合理的结果)。

该示例可以适应更多的“关键字”或其他结果。

class String
  #Return 'keyword'
  #Detects:
  #- true (independend of lower letters/capitals)
  #- false (independend of lower letters/capitals)
  #- nil/NULL (independend of lower letters/capitals)
  def to_keyword
    case self
      when /\Atrue\Z/i; true
      when /\Afalse\Z/i; false
      when /\Anil\Z/i, /\ANULL\Z/; nil
      else; self.to_sym #return symbol. Other posibility: self.
    end
  end
end


p 'true'.to_keyword #true
p 'TRUE'.to_keyword #true
p 'false'.to_keyword #false
p 'NULL'.to_keyword #nil  (NULL is used in DB like nil)
p 'NULLc'.to_keyword #:NULLc  not detected -> symbol

【讨论】:

    【解决方案2】:

    试试这个:

    ruby-1.9.2-p136 :001 > true
     => true 
    ruby-1.9.2-p136 :002 > eval("true")
     => true
    

    【讨论】:

    • 但别忘了evil is eval
    • 请不要这样做!非常危险!!!考虑一下。如果这是在其参数通过控制器传递的模型中(几乎总是如此),则恶意附加可能会评估您认为只是复选框的任何内容。
    【解决方案3】:

    你可以试试yaml:

    require "yaml"
    p YAML.load('true')
    p YAML.load('TRUE')
    p YAML.load('false')
    p YAML.load('nil')
    p YAML.load('NULL') #nil
    

    【讨论】:

      【解决方案4】:

      我最喜欢 Knut 的回答。我不认为我会支持“Null”和其他人。 这是一个更简单的版本。

      class String
        def to_keyword
          self == "true"
        end
      end
      
      >> "true".to_keyword
      => true
      >> "false".to_keyword
      => false
      

      这个问题很简单。在您的测试中,您可以简单地

      :correct => (true_string == "true")
      

      【讨论】:

        【解决方案5】:

        根据您的评论,您可以执行以下操作:

        true_string = "true"
        
        :correct => !!true_string
        
        # examples
        !true_string #=> false
        !!true_string #=> true
        !!!true_string #=> false
        ...
        

        【讨论】:

          猜你喜欢
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-17
          • 2017-02-11
          • 2016-07-21
          相关资源
          最近更新 更多