gpt4 book ai didi

ruby - objects .ruby 中的每个方法,让我从对象中读取值,但不会让我向它写入值。范围问题?

转载 作者:太空宇宙 更新时间:2023-11-03 16:08:48 24 4
gpt4 key购买 nike

所以我用 Ruby 为我正在进行的项目编写了一个二维数组类。

这很简单:initialize 创建一个方形二维数组,其大小由其参数指定,称为 @contents

我重载了 [] 运算符以使对象中的数据可访问,如下所示:

def [] (x, y)
@contents[x][y]
end

def []=(x, y, z)
@contents[x][y] = z
end

我向它添加了一个 each 方法,这样我就可以混入可枚举模块,并赋予它一些功能,如下所示:

def each
i, j =0,0
while (i<@size)
while(j<@size)
yield @contents[i][j]
j+=1
end
i, j = i+1, 0
end
end

我给了它一个to_s方法,像这样:

def to_s
@contents.each{|i| puts i}
end

现在,我在新文件中创建此二维数组对象的新实例,并尝试填充它。最初,我使用嵌套循环手动完成此操作,如下所示:

j, i, k= 0, 0, 0
puts " size = #{@size}"
while (i<@size)
while(j<@size)
@2Darray[i,j], k, j= @array[k], k+1, j+1
end
i, j=i+1, 0
end

而且效果很好。 to_s 方法将完美地打印出数组。不过我意识到,这些嵌套循环可能不是“ruby 方式”,并尝试使用迭代器来实现。我已经实现了一个 each 方法,所以我尝试用以下方法替换上面的方法:

j=0
@2Darray.each{|i|
i = @array[j]
j += 1
break unless j < size
}

但是,不幸的是,这不起作用。它运行得很好,但是当调用 to_s 时,它会一行一行地打印任何内容。即,它打印出一组空数组。

我以为这是我的 .each 方法,但当 to_s 方法调用它时它工作正常。我认为它可能是我的 []= 方法,但当我使用嵌套的 while 循环时它工作正常。

现在我认为这一定是范围界定的问题。在我上面的每个循环中,|i| 是一个局部变量,对吗?所以我将 array[j] 的值分配给 i,但 i 只是我要填充的(空)位置的副本,是吗?

那么,首先,我是在正确的轨道上,还是我的问题完全出在其他地方?如果是,在哪里,如果不是:我如何修改上面的每个循环,以对@2Darray 中的数据进行分配,而不是仅仅更改 |i| 占位符的值。

为我的冗长道歉,感谢您的宝贵时间!任何帮助将不胜感激。

最佳答案

@2Darray.each{|i| i=@array[j]

这不是您可以填充任何@2Darray 的方式。 i是 block 局部变量。 #each 方法有效地为每个元素调用您的 block (迭代器),传递对该 block 局部变量中元素的引用。分配给一个变量不会改变该变量之前指向的对象。

填充它的“ruby 方式”是提供一个实例方法,该方法接受要使用的数据,然后使用任何合适的循环。

就其值(value)而言,您的 while(i<@size)循环可以很好地表示为 @size.times

关于ruby - objects .ruby 中的每个方法,让我从对象中读取值,但不会让我向它写入值。范围问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8205553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com