Единственный способ сделать буквально то, что вы ищете, это:
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