难以修改二维rubyarrays
请原谅新手问题。 我正在尝试在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
行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
each
元素的值 each
传递给block参数,而不是元素本身,所以column = 1
实际上并没有修改数组。
但是,您可以一步完成此操作 – 有关各种forms的Array#new
详细信息,请参阅API文档 。 尝试a = Array.new(width) {|i| Array.new(height) {|j| 1 } }
a = Array.new(width) {|i| Array.new(height) {|j| 1 } }
你可以像这样创建吗?
a=Array.new(width) { Array.new(height,1) }
嵌套each
循环中的column
是数组中该位置的值的副本,而不是指向它的指针/引用,因此当您更改其值时,您只是更改副本的值(它不再存在于块)。
如果你只想要一个用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