将对象类型转换为字符串

时间:2016-11-10 14:24:20

标签: json ruby types

我有一个相当特殊的问题,我需要在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/catchrescue块作为实际字符串,但它不可靠,因为它打破了自定义类(比如我说{{1}它以字符串形式拯救并最终成为相当丑陋的代码。

s = SomeClass.new, JSON.load("s")
唉,我要问的问题是,是否有办法有效地“转换”#34;一个字符串,找出字符串中包含的内容的对象类型?

道歉,如果这个问题得到解答,我已经搜索了很长时间,但无济于事。现在,我觉得答案是"没有"。

感谢您的帮助!

2 个答案:

答案 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.01(感谢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, {}, []]