我有一个相当特殊的问题,我需要在Ruby中解决这个问题。
我收到一个值列表,比如说:
["foo", "0.0", "1", "{}", "[]"]
我想揭示每个元素的实际类型,对它已经转换为String类型的事实没有任何力量。
我最初的尝试是使用JSON反序列化单独加载每个值,例如:
my_list.each |element| do
puts JSON.load(element).class
end
然而,这有各种警告意味着它不能正常工作。
e.g。 JSON.load("0.0").class
会给我Float
,但JSON.load("foo").class
当然会炸弹。我的解决方案是使用try/catch
或rescue
块作为实际字符串,但它不可靠,因为它打破了自定义类(比如我说{{1}它以字符串形式拯救并最终成为相当丑陋的代码。
s = SomeClass.new, JSON.load("s")
唉,我要问的问题是,是否有办法有效地“转换”#34;一个字符串,找出字符串中包含的内容的对象类型?
道歉,如果这个问题得到解答,我已经搜索了很长时间,但无济于事。现在,我觉得答案是"没有"。
感谢您的帮助!
答案 0 :(得分:2)
['foo', "0.0", "1", "{}", "[]"].map { |a| eval a rescue a }
#=> ['foo', 0.0, 1, {}, []]
获得课程:
['foo', "0.0", "1", "{}", "[]"].map { |a| (eval a rescue a).class }
#=> [String, Float, Fixnum, Hash, Array]
我确信可能存在极端情况,但如果您拥有示范列表中的数据,它应该可以正常工作..
答案 1 :(得分:2)
如果您的值是JSON字符串,eval
将失败。使用JSON.parse
:
['foo', "0.0", "1", "{}", "[]"].map {|a| JSON.parse(a, quirks_mode: true) rescue a }
# => ["foo", 0.0, 1, {}, []]
:quirks_mode
option可以解析单个值,例如0.0
和1
(感谢Stefan)。
但是,在没有指定错误类的情况下使用rescue
通常是个坏主意,所以这会更好:
['foo', "0.0", "1", "{}", "[]"].map do |val|
begin
JSON.parse(val, quirks_mode: true)
rescue JSON::ParserError
val
end
end
# => ["foo", 0.0, 1, {}, []]