正如标题所说......如果我有一个包含子阵列的数组,是否可以拆分数组并重命名新的拆分数组?我知道我可以简单地键入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"]...
我希望这有道理......谢谢 弗兰克
答案 0 :(得分: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 }
答案 1 :(得分: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(和每个块)都有自己的范围,而不是与顶级范围共享:
array.each_with_index do |element, i|
eval("array#{i + 1} = element")
end
puts array1 # => NameError