1

正如标题所说......如果我有一个包含子数组的数组,是否可以拆分数组并重命名新的拆分数组?我知道我可以简单地键入 new_array=array[0] 等等,但问题是包含子数组的原始数组的大小会有所不同。

原始数组...

array=[["a", "1", "2", "3"], ["b", "1", "2", "3"],  ["c", "1", "2", "3"]...]

拆分和重命名数组...

array1=["a", "1", "2", "3"]
array2=["b", "1", "2", "3"] 
array3=["c", "1", "2", "3"]...

我希望这是有道理的......谢谢弗兰克

4

2 回答 2

1

你可以做一些花哨的东西来创建一堆变量来保存子数组,但是你必须做更多令人困惑的花哨的东西来处理新的变量。每当您认为要动态创建一堆变量时,您通常希望创建一个 Hash 作为一个小的可移植命名空间:

arrays = Hash[array.inject([]) { |m, a| m << ["array#{m.length + 1}", a] }]

这会给你这个arrays

{
    "array1" => ["a", "1", "2", "3"],
    "array2" => ["b", "1", "2", "3"],
    "array3" => ["c", "1", "2", "3"]
}

这比使用一堆新变量要容易得多,这些变量的名称要到运行时才知道。

如果你愿意的话,你可以用更简单的东西来构建相同的结构:

arrays = { }
array.each_with_index { |a, i| arrays["array#{i + 1}"] = a }
于 2012-03-10T05:09:30.860 回答
1

我认为完全按照您的要求做的唯一方法是:

array=[["a", "1", "2", "3"], ["b", "1", "2", "3"],  ["c", "1", "2", "3"]]

array.each_with_index do |element, i|
  instance_variable_set "@array#{i + 1}", element
end

puts @array1 # => ["a", "1", "2", "3"]
puts @array2 # => ["b", "1", "2", "3"]

但是,当然,这是非常丑陋的。除非您绝对需要这样做,否则您应该找到一种方法来使用您的数组而不将其转换为变量列表。您通常也不需要将其转换为哈希 - 这只是将一种索引样式转换为另一种索引样式,并没有为您提供任何附加功能。

有趣的是,请注意这不起作用,因为 eval (和 each 块)有自己的范围,不与顶级范围共享:

array.each_with_index do |element, i|
  eval("array#{i + 1} = element")
end

puts array1 # => NameError
于 2012-03-10T07:47:41.610 回答