请原谅新手问题。我正在尝试在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
答案 0 :(得分:3)
变量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 :(得分:1)
each
将每个元素的值传递给块参数,而不是元素本身,因此column = 1
实际上不会修改数组。
您可以一步完成此操作 - 有关各种形式Array#new
的详细信息,请参阅the API docs。试试a = Array.new(width) {|i| Array.new(height) {|j| 1 } }
答案 2 :(得分:0)
你可以像这样创建吗?
a=Array.new(width) { Array.new(height,1) }
答案 3 :(得分:-1)
column
循环中的 each
是数组中该位置的值的副本,而不是指向它的指针/引用,因此当您更改其值时,您只需更改副本的值(不再存在于块外)。
如果你只是想要一个填充了1
的二维数组,那么这样就可以了:
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