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

サブ配列を保持するための変数の束を作成するためにいくつかの派手なパンツのようなものを行うことができますが、新しい変数を機能させるためにもっと紛らわしい派手なパンツのようなものを行う必要があります。一連の変数を動的に作成したい場合は、通常、小さなポータブル名前空間としてハッシュを作成する必要があります。

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(および各ブロック)には独自のスコープがあり、トップレベルのスコープとは共有されないため、これは機能しないことに注意してください。

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

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