2012-03-10 6 views
1

Как говорится в заголовке ... если у меня есть массив, содержащий подмассивы, можно ли разбить массив и переименовать новые массивы split? Я знаю, что могу просто набрать new_array = array [0] и так далее, но проблема в том, что исходный массив, содержащий вспомогательные массивы, будет отличаться по размеру.Ruby - разделенные и переименованные подмассивы

оригинальный массив ...

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"]... 

Я надеюсь, что имеет смысл ... спасибо Frank

+1

Есть ли основной реальный случай использования для этого, или это просто домашняя проблема? Я понимаю, о чем вы спрашиваете, а mu слишком коротко, если вы предлагаете разумное решение, но если есть что-то, что вы пытаетесь выполнить, для чего это необходимо, некоторый контекст будет полезен. –

ответ

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 
+0

извините за поздний ответ, не успел до сих пор попробовать это. Спасибо за помощь, которая делает именно то, о чем я просил, и вы правы, это немного грязно и сбивает с толку, но это единственное, о чем я мог подумать. Единственное, что я могу придумать, но не знаю, как это сделать, - это получить доступ к подэлементам подмассивов. Пример: получение значений «a», «b», «c» либо в виде нового массива, либо индивидуально. Смысл ??? – JoMojo

+0

Вы можете просто сделать '@ array1 [0]' (= "a"), '@ array1 [1]' (= "1") и т. Д. Это то, что вы имеете в виду? – user2398029

+0

Нет, не совсем. Используя тот же пример массива из моего OP ... array = [["a", "1", "2", "3"], ["b", "1", "2", "3"], ["c", "1", "2", "3"] ...]. Я знаю, что могу получить подмассивы с массивом [0], который возвращает массив [0] = ["a", "1", "2", "3"]. Но тогда как я могу получить элемент «а» оттуда? Что-то вроде: array [0, 0] = "a", array [0, 1] = "1" ... извините, если мое объяснение сбивает с толку, но я уверен, что вы уже поняли, что в целом Я ЕСМЬ смущен :) – JoMojo

1

Вы могли бы сделать некоторые фантазии -pants, чтобы создать кучу переменных, чтобы удерживать под-массивы, но тогда вам придется делать больше путающих фэнтезийных вещей, чтобы работать с новыми переменными. Всякий раз, когда вы думаете, что вы хотите динамически создавать кучу переменных, обычно требуется, чтобы создать 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 } 
+0

Спасибо за ваш ответ mu слишком короткий ... Я попробовал ваше предложение, и он несколько работает, но потом мне нужно найти переименованные массивы с массивами []. Например, я не могу использовать массив1. Имейте в виду, что попытка манипулировать массивами в такой степени очень полезна для меня. – JoMojo

+0

@FrankN: Но вы можете задать «массивы», какие ключи у него есть. Если вы создали динамическую переменную 'array11' динамически, как бы вы знали, какие имена переменных у вас были? И как только вы узнали, что у вас их было 11, вы бы сделали больше динамических манипуляций для доступа к переменным, основанным только на их именах. Вы можете пропустить всю эту работу, используя Hash вместо динамического создания переменных. Использование хэша также прекрасно избегает возможных конфликтов имен и конфликтов. –

+0

благодарит за информацию. Я не очень разбираюсь в том, как работают хеши, но я буду изучать их, может быть, они просто то, что мне нужно, и никогда не знали об этом. :) Я признаю, что я немного над головой со всем этим, но здорово попробовать и узнать что-то новое и получить желаемый результат ... – JoMojo