动态字符串 to_i 或 to_f

String to_i or to_f dynamically

我正在根据从 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
  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 作为字符串返回的整数这一事实外,它工作得很好。

我希望我的 class 在这里变得聪明并将这些值更改为整数,但到目前为止我想出的唯一方法感觉非常不-ruby.

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

[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

这是我唯一的选择吗?

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,定义一个新方法:

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

"foo123bar".match_integer  #=> 123