【问题标题】:Convert a String Containing an Array to an Array in Ruby将包含数组的字符串转换为 Ruby 中的数组
【发布时间】:2010-02-22 04:37:41
【问题描述】:

我有一个字符串,其中包含一个我想转换为数组的数组。你会怎么做?

我想转换这个:

myvar=
"[[Date.UTC(2010, 0, 23),0],[Date.UTC(2010, 0, 24),0],[Date.UTC(2010, 0, 25),3],[Date.UTC(2010, 0, 26),0],[Date.UTC(2010, 0, 27),0],[Date.UTC(2010, 0, 28),0],[Date.UTC(2010, 0, 29),0],[Date.UTC(2010, 0, 30),0],[Date.UTC(2010, 0, 31),0],[Date.UTC(2010, 1, 01),0],[Date.UTC(2010, 1, 02),0],[Date.UTC(2010, 1, 03),1],[Date.UTC(2010, 1, 04),2],[Date.UTC(2010, 1, 05),0],[Date.UTC(2010, 1, 06),0],[Date.UTC(2010, 1, 07),0],[Date.UTC(2010, 1, 08),0],[Date.UTC(2010, 1, 09),0],[Date.UTC(2010, 1, 10),0],[Date.UTC(2010, 1, 11),0],[Date.UTC(2010, 1, 12),0],[Date.UTC(2010, 1, 13),0],[Date.UTC(2010, 1, 14),0],[Date.UTC(2010, 1, 15),0],[Date.UTC(2010, 1, 16),0],[Date.UTC(2010, 1, 17),0],[Date.UTC(2010, 1, 18),0],[Date.UTC(2010, 1, 19),0],[Date.UTC(2010, 1, 20),0],[Date.UTC(2010, 1, 21),0]]"
myvar.class
>>string

进入这个:

myvar = 
[[Date.UTC(2010, 0, 23),0],[Date.UTC(2010, 0, 24),0],[Date.UTC(2010, 0, 25),3],[Date.UTC(2010, 0, 26),0],[Date.UTC(2010, 0, 27),0],[Date.UTC(2010, 0, 28),0],[Date.UTC(2010, 0, 29),0],[Date.UTC(2010, 0, 30),0],[Date.UTC(2010, 0, 31),0],[Date.UTC(2010, 1, 01),0],[Date.UTC(2010, 1, 02),0],[Date.UTC(2010, 1, 03),1],[Date.UTC(2010, 1, 04),2],[Date.UTC(2010, 1, 05),0],[Date.UTC(2010, 1, 06),0],[Date.UTC(2010, 1, 07),0],[Date.UTC(2010, 1, 08),0],[Date.UTC(2010, 1, 09),0],[Date.UTC(2010, 1, 10),0],[Date.UTC(2010, 1, 11),0],[Date.UTC(2010, 1, 12),0],[Date.UTC(2010, 1, 13),0],[Date.UTC(2010, 1, 14),0],[Date.UTC(2010, 1, 15),0],[Date.UTC(2010, 1, 16),0],[Date.UTC(2010, 1, 17),0],[Date.UTC(2010, 1, 18),0],[Date.UTC(2010, 1, 19),0],[Date.UTC(2010, 1, 20),0],[Date.UTC(2010, 1, 21),0]]
myvar.class
>>Array

【问题讨论】:

    标签: ruby arrays string


    【解决方案1】:

    虽然显而易见的答案涉及eval,但这很危险。相反,我建议对其进行解析。由于这是一种定义明确的数据格式(看起来),您可以使用它:

    myvar.scan(/\d+/).map(&:to_i).each_slice(4).map{|*x,y| [Date.UTC(*x), y]}
    

    这会

    • 拉出所有数字
    • 将它们转换为整数
    • 将它们分成四组
    • 将每组的前三个作为第一个到第三个参数应用于 Date.UTC
    • 将每个日期与其对应的y配对
    • 创建一个包含所有这些对的数组。

    我没有Date.UTC 方法,但我假设您有一些自定义方法称为。

    【讨论】:

    • 嗯...所以 Date.UTC 实际上是我试图嵌入到 html 中的 javascript 函数,而不是 Ruby 中的函数。您的解决方案在技术上是正确的,但由于 ruby​​ 没有 date.utc 而提供了错误。哦,好吧...感谢您提供的信息,我以后可能会使用它。
    【解决方案2】:

    尝试 eval 命令

    x = eval("[\"foo\",\"bar\",\"land\"]")

    => ["foo", "bar", "land"]

    x

    => ["foo", "bar", "land"]

    但是eval是危险使用时要小心。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多