Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 类变量在首次运行函数后返回空_Ruby_Arrays_Oop - Fatal编程技术网

Ruby 类变量在首次运行函数后返回空

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_

我正在用Ruby写一篇文章。到目前为止,我已经找到了密码

我遇到的问题是:当我运行下面的函数时,在游戏开始时生成的实例变量@code在第一次运行函数后返回空

我已经分配了一个局部变量tempcode和@code的值,所有操作都是在函数中对tempcode执行的。我还为@code分配了一个attr_读取器,而不是attr_访问器。所以@code不应该改变

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的经验中了解到这一点的