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

时间:2014-12-08 01:35:47

标签: ruby arrays oop

我在Ruby中编写mastermind game。到目前为止,我的代码位于here on github

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

我已经分配了一个局部变量,tempcode,@ code的值,并且所有操作都是在函数内的tempcode中完成的。我还为@code分配了一个attr_reader,而不是attr_accessor。所以@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。

2 个答案:

答案 0 :(得分:0)

您分配数组tempcode = @code并使用tempcode.delete_at[a]进行修改,这也会改变@code。要解决此问题,您可以使用

tempcode = @code.clone

这种方式@code不受tempcode'更改

的影响

答案 1 :(得分:0)

当您指定一个数组时,它只复制引用,并且它们都指向相同的引用。 因此,当您打印其中任何一个时,都会反映出一个更改。

orig_array = [1,2,3,4]<br>
another_array = orig_array

puts orig_array.unshift(0).inspect
puts another_array.inspect

输出:

[0,1,2,3,4]
[0,1,2,3,4]

为避免这种情况,您可以使用Marshal从原始数组进行复制,而不会影响复制到的对象。 原始数组中的任何更改都不会更改复制到的对象。

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

输出:

[0,1,2,3,4]
[1,2,3,4]