Ruby - разбивать и переименовывать подмассивы - PullRequest
1 голос
/ 10 марта 2012

Как видно из заголовка ... если у меня есть массив, содержащий подмассивы, возможно ли разбить массив и переименовать новые массивы?Я знаю, что могу просто набрать 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"]...

Надеюсь, это имеет смысл ... спасибо Фрэнк

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Единственный способ сделать буквально то, что вы ищете, это:

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
1 голос
/ 10 марта 2012

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