2014-09-26 4 views
0

Я пытаюсь заполнить многомерный массив в рубине, прочитав из файла. Вот код:Заполнение массива рубинов из файла

class Maze 
    attr_accessor :array 



    def initialize(filename) 
     handler = File.open(filename,"r") 
     @array = Array.new(10,Array.new(10)) 
     n = 0; 
     i = 0; 
     while(line = handler.gets) do 
      i = 0 

      line.chomp.each_char do |char| 
       p char 
       @array[n][i] = char 
       i += 1 
      end #iterator over character in every line 
      n += 1 
     end #iterator over file lines 
     handler.close 
    end #constructor 
end #class 
a = Maze.new("maze.txt") 
p a.array 

Вот содержание файла:

########## 
#  # 
# #### # 
# # # # 
@ # # ? 
# # # # 
# #  # 
# #### # 
#  # 
########## 

Однако эта строка кода (последняя строка кода)

p a.array 

Напечатает массив 10 на 10, но с символами «#». Нет пробелов или «?». Важно отметить, что

p char 

В блоке, где я присваиваю массив значениями, печатаются правильные символы. Он печатает пробелы в нужное время и вопросительные знаки и т. Д. Я знаю, что это что-то очень простое, но это подтачивает меня, и я думаю, что мне нужно свежую пару глаз, чтобы посмотреть его.

Почему массив имеет только Символы «#». Почему не все другие персонажи, такие как «", "@", "?" в моем массиве? Является ли присвоившей в моем коде неправильно закодирован

+0

Что вы хотите сказать? – sawa

+0

Почему массив имеет только символы «#». Почему не все другие персонажи, такие как «", "@", "?" в моем массиве? Является ли присвоение в моем коде ошибочно закодированным? – Bula

+1

Поместите свой комментарий в свой вопрос, так как он определяет, что вы пытаетесь сделать. –

ответ

1

I 'd напишите код по-другому. Это не совсем понятно, что вы пытаетесь сделать, так что здесь две разные вещи, которые я бы сделать:

class Maze 
    attr_accessor :array 

    def initialize(filename) 
    @array = [] 
    File.foreach(filename) do |line| 
     @array << line.chomp 
    end 
    end 

end 

a = Maze.new("maze.txt") 
p a.array 
puts a.array 

Какие выходы:

["##########", "#  #", "# #### #", "# # # #", "@ # # ?", "# # # #", "# #  #", "# #### #", "#  #", "##########"] 
########## 
#  # 
# #### # 
# # # # 
@ # # ? 
# # # # 
# #  # 
# #### # 
#  # 
########## 

Или:

class Maze 
    attr_accessor :array 

    def initialize(filename) 
    @array = [] 
    File.foreach(filename) do |line| 
     @array << line.chomp.split('') 
    end 
    end 

end 

a = Maze.new("maze.txt") 
p a.array 
puts a.array.map(&:join) 

, который выводит :

[["#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["#", " ", " ", " ", " ", " ", " ", " ", " ", "#"], ["#", " ", "#", "#", "#", "#", " ", " ", " ", "#"], ["#", " ", "#", " ", " ", "#", " ", " ", " ", "#"], ["@", " ", "#", " ", " ", "#", " ", " ", " ", "?"], ["#", " ", "#", " ", " ", "#", " ", " ", " ", "#"], ["#", " ", "#", " ", " ", " ", " ", " ", " ", "#"], ["#", " ", "#", "#", "#", "#", " ", " ", " ", "#"], ["#", " ", " ", " ", " ", " ", " ", " ", " ", "#"], ["#", "#", "#", "#", "#", "#", "#", "#", "#", "#"]] 
########## 
#  # 
# #### # 
# # # # 
@ # # ? 
# # # # 
# #  # 
# #### # 
#  # 
########## 

Основная проблема i В вашем коде вы используете ссылки на массивы, когда вы назначаете субмассивы, что приводит к тому, что все они указывают на одну и ту же память. Я думаю, вы сделали это, потому что привыкли к другому языку, на котором вы должны предопределить размер вашего массива. Ruby более дружелюбен, чем это позволяет нам легко добавлять в массив. Я использовал для оператора <<, но существуют другие методы, чтобы сделать то же самое; << легче видеть и понимать.

Вместо того, чтобы открыть файл, а затем, используя while цикл для перебора над ним, это более идиоматических использовать foreach, который выполняет то же самое, и автоматически закрывает файл, когда блок выходит.

Кроме того, вместо повторения символов каждой строки просто разделите строку на split(''), которая вернет массив символов. Добавьте это к @array и двигайтесь дальше.

0

Виновником пути вы инициализация массива в этой строке:

@array = Array.new(10,Array.new(10)) 

это создает массив из 10 элементов и инициализирует их все с указатель на другой массив из 10 элементов. Все 10 элементов будут использовать один и тот же массив. Вы можете увидеть упрощенный пример здесь:

b = Array.new(3,Array.new(3)) 
b[0][0] = '00' 
puts b # you'll see '00' printed 3 times! 

Один способ исправить вашу программу для создания массива строк, а затем затем инициализировать каждую строку в другой массив:

@array = Array.new(10) 
for i in 0..9 
    # initialize each row to a unique array 
    @array[i] = Array.new(10) 
end 
# the rest of your code 
Смежные вопросы