Ruby 类变量在首次运行函数后返回空
我正在用Ruby写一篇文章。到目前为止,我已经找到了密码 我遇到的问题是:当我运行下面的函数时,在游戏开始时生成的实例变量@code在第一次运行函数后返回空 我已经分配了一个局部变量tempcode和@code的值,所有操作都是在函数中对tempcode执行的。我还为@code分配了一个attr_读取器,而不是attr_访问器。所以@code不应该改变Ruby 类变量在首次运行函数后返回空,ruby,arrays,oop,Ruby,Arrays,Oop,我正在用Ruby写一篇文章。到目前为止,我已经找到了密码 我遇到的问题是:当我运行下面的函数时,在游戏开始时生成的实例变量@code在第一次运行函数后返回空 我已经分配了一个局部变量tempcode和@code的值,所有操作都是在函数中对tempcode执行的。我还为@code分配了一个attr_读取器,而不是attr_访问器。所以@code不应该改变 def compare_guess_to_code() correct_color = "1" correct_
def compare_guess_to_code()
correct_color = "1"
correct_color_and_pos = "2"
incorrect_color = "0"
tempcode = @code
a = 0
@guess.length.times do #maybe a for loop that goes through both arrays simultaneously?
case
when @guess[a] == tempcode[a]
feedback.push(correct_color_and_pos)
tempcode.delete_at[a]
@guess.delete_at[a]
when guess[a] != tempcode[a] && tempcode.include?(guess[a])
feedback.push(correct_color)
tempcode.delete_at[a]
@guess.delete_at[a]
when !(tempcode.include?(guess[a]))
feedback.push(incorrect_color)
tempcode.delete_at[a]
@guess.delete_at[a]
else
puts "Error"
end
end
feedback.sort!
feedback.reverse!
print "Feedback: #{feedback}"
end
反馈返回正常,一切似乎都很好,我只是不能在@code清空之前多次执行比较函数。如何保持值的一致性
如果您想运行程序来测试它,请使用mastermind/lib/mastermind.rb 分配数组
tempcode=@code
并使用tempcode对其进行修改。删除[a]
处的\u,这也将更改@code。要修复它,您可以使用
tempcode = @code.clone
这样
@code
就不会受到tempcode'
s更改的影响当您指定一个数组时,它只复制引用,并且两个数组都指向同一引用。
因此,当您打印其中任何一个时,都会反映其中一个的更改
orig_array = [1,2,3,4]<br>
another_array = orig_array
puts orig_array.unshift(0).inspect
puts another_array.inspect
orig_数组=[1,2,3,4]
另一个数组=原始数组
放置原始数组。取消移位(0)。检查
放置另一个_array.inspect
输出:[0,1,2,3,4]
[0,1,2,3,4] 为了避免这种情况,可以使用封送处理从原始数组复制,而不会影响复制到的对象。 原始数组中的任何更改都不会更改将其复制到的对象
orig_array = [1,2,3,4]<br>
another_array = Marshal.load(Marshal.dump(orig_array))
puts orig_array.unshift(0).inspect
puts another_array.inspect
orig_数组=[1,2,3,4]
另一个数组=Marshal.load(Marshal.dump(orig_数组))
放置原始数组。取消移位(0)。检查
放置另一个_array.inspect
输出:[0,1,2,3,4]
[1、2、3、4]这是一个引用,您的temp变量是对同一数组的引用。你需要复制它。谢谢,这很有效,但为什么?我对变量的理解是,如果执行a=8 b=a a=“8”b将返回8,那么这里的区别是什么呢?发生的是变量只存储对对象的引用,而不是对象本身。这里的code和tempcode都指向同一个数组对象,更改tempcode会将对象代码点更新为。在您的示例中,a指向8,b=a=>b也指向8,a=“8”=>a现在指向“8”,b仍然指向8。谢谢。你能推荐一些关于这个的阅读吗?到目前为止,我所阅读的所有文本或教程都没有提到这种行为。我认为这很好地说明了这一点。我找不到任何其他教程,实际上我是从我使用Java的经验中了解到这一点的