修改二维ruby数组的困难
请原谅这个新手问题。我试图在ruby中创建一个二维数组,并将其所有值初始化为1。我的代码很好地创建了二维数组,但是没有修改它的任何值 谁能解释我做错了什么修改二维ruby数组的困难,ruby,arrays,multidimensional-array,Ruby,Arrays,Multidimensional Array,请原谅这个新手问题。我试图在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|
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
嵌套的
中的列
每个
循环都是数组中该位置的值的副本,而不是指向该值的指针/引用,因此当您更改其值时,您只更改副本的值(该副本在块外不再存在)
如果您只想要一个填充了1
s的二维数组,那么简单的操作如下:
def mda(width,height)
[ [1] * width ] * height
end
很简单
顺便说一下,如果您想知道如何在迭代二维数组时修改它的元素,这里有一种方法(从代码中的第6行开始):
each
将每个元素的值传递到块参数中,而不是元素本身,因此column=1
实际上不会修改数组
不过,您只需一步即可完成此操作-有关各种形式的
Array#new
的详细信息,请参阅。试试a=Array.new(width){i|Array.new(height){j|1}}
你可以这样创建它吗
a=Array.new(width) { Array.new(height,1) }
它是行
行。每个do |列
变量列
是行中值的副本。不能以这种方式编辑其值。你必须做到:
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
或者更好:
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
或者更好:
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
“宽度”和“高度”混淆了吗?此外,这可以在没有块的情况下完成:Array.new(高度,Array.new(宽度,1))@steenslag,不,它不能。如果以这种方式构建多维数组,当您为其中一个元素赋值时,它将扩展到整个列。这就像array=[[1]*w]*h
,您只需将指针复制到同一个一维数组。关于宽度
和高度
的混合-这是另一个问题,作者不应该讨论这个问题。它必须至少有一个块。请参阅Nakilon回答下的注释:此数组创建不起作用(尝试更改其中一个值)。不使用块变量时,不需要包含块变量。我不知道这一点。我假设它们就像方法参数,如果它们不存在,Ruby会抱怨。啊,好极了!