字符串to_i或to_f动态

时间:2015-01-23 16:22:23

标签: ruby type-conversion metaprogramming

我是根据从API收到的response_header动态创建attr_readers和实例变量。

response_header哈希回复如下:

{
    "server"=>"nginx",
    "x-ua-compatible"=>"IE=edge,chrome=1",
    "expires"=>"Thu, 01 Jan 1970 00:00:00 GMT",
    "cache-control"=>"no-cache, must-revalidate",
    "pragma"=>"no-cache",
    "rate-limit"=>"1000",
    "rate-limit-remaining"=>"986",
    "rate-limit-reset"=>"1265",
    "content-type"=>"application/json;charset=UTF-8",
    "content-language"=>"en",
    "transfer-encoding"=>"chunked",
    "vary"=>"Accept-Encoding",
    "date"=>"Fri, 23 Jan 2015 15:38:56 GMT",
    "connection"=>"close",
    "x-frame-options"=>"SAMEORIGIN"
  }

此get被发送到名为ResponseHeader

的类中
  class ResponseHeader
    def initialize(options = {})
      options.each do |key, value|
        instance_variable_set("@#{key}", value)
        self.send(:attr_reader, key)
      end
    end
  end

除了rate-limitrate-limit-remainingrate-limit-reset显然是从API返回的字符串这一事实之外,这项工作非常顺利。

我希望我的班级在这里变得聪明,并将这些值改为整数,但到目前为止我唯一能提出的方法感觉非常不重要。

基本上我正在转换为一个整数,然后返回一个字符串,看它是否等于原始值。

[8] pry(main)> "ABC".to_i
=> 0
[9] pry(main)> _.to_s
=> "0"
[10] pry(main)> _ == "ABC"
=> false
[11] pry(main)> "100".to_i
=> 100
[12] pry(main)> _.to_s
=> "100"
[13] pry(main)> _ == "100"
=> true

这是我唯一的选择吗?

1 个答案:

答案 0 :(得分:2)

Ruby Integer将字符串解析为整数,如果解析失败则引发错误:

i = Integer("123")  #=> 1234
i = Integer("abc")  #=> ArgumentError: invalid value for Integer(): "abc"

还可以解析二进制,八进制和十六进制:

i = Integer("0b10")  #=> 2
i = Integer("010")   #=> 8
i = Integer("0x10")  #=> 16

要解析基数10,请提供基数:

i = Integer("010",10)  #=> 10

要在字符串中匹配,请使用正则表达式:

s = "foo123bar"
i = s=~/-?\d+/ ? Integer($&,10) : nil  #=> 123

要修补String类,请定义一个新方法:

class String
  def match_integer
    self=~/-?\d+/ ? Integer($&,10) : nil
  end
end

"foo123bar".match_integer  #=> 123