сложность модификации двумерного массива ruby - PullRequest
3 голосов
/ 25 октября 2010

Извините вопрос новичка. Я пытаюсь создать двумерный массив в ruby ​​и инициализировать все его значения равными 1. Мой код просто создает двумерный массив, но не может изменить любое из его значений.

Может кто-нибудь объяснить, что я делаю не так?

  def mda(width,height)
     #make a two dimensional array
     a = Array.new(width)
     a.map! { Array.new(height) }

     #init all its values to 1
     a.each do |row|
       row.each do |column|
          column = 1
       end
     end
     return a
  end

Ответы [ 4 ]

3 голосов
/ 25 октября 2010

В строке row.each do |column| переменная column является копией значения в row. Вы не можете редактировать его значение таким образом. Вы должны сделать:

def mda(width,height)
  a = Array.new(width)
  a.map! { Array.new(height) }
  a.each do |row|
    row.map!{1}
  end
  return a
end

Или лучше:

def mda(width,height)
  a = Array.new(width)
  a.map! { Array.new(height) }

  a.map do |row|
    row.map!{1}
  end
end

Или лучше:

def mda(width,height)
  a = Array.new(width){ Array.new(height) }
  a.map do |row|
    row.map!{1}
  end
end

Или лучше:

def mda(width,height)
  Array.new(width) { Array.new(height){1} }
end
1 голос
/ 25 октября 2010

each передает в параметр блока значение каждого элемента, а не самого элемента, поэтому column = 1 фактически не изменяет массив.

Вы можете сделать это за один шаг, однако - смотрите Документы API для получения подробной информации о различных формах Array#new. Попробуйте a = Array.new(width) {|i| Array.new(height) {|j| 1 } }

0 голосов
/ 25 октября 2010

Вы можете создать это так?

a=Array.new(width) { Array.new(height,1) }
0 голосов
/ 25 октября 2010

column в вашем вложенном цикле each - это копия значения в этом месте массива, а не указатель / ссылка на него, поэтому при изменении его значения вы меняете только значение копии (который перестает существовать вне блока).

Если вы просто хотите, чтобы двумерный массив заполнялся 1 s, что-то настолько простое, как это будет работать:

def mda(width,height)
  [ [1] * width ] * height
end

Довольно просто.


Кстати, если вы хотите знать, как изменять элементы двумерного массива при его итерации по нему, вот один из способов (начиная со строки 6 в вашем коде):

 #init all its values to 1
 a.length.times do |i|
   a[i].length.times do |j|
     a[i][j] = 1
   end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...