动态字符串 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-limit
、rate-limit-remaining
和 rate-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
我正在根据从 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-limit
、rate-limit-remaining
和 rate-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