Ruby - 实例变量值自行更改

时间:2016-01-29 18:06:18

标签: arrays ruby variables iteration instance-variables

我的代码中的实例变量继续重新分配其值,尽管没有命令这样做。本质上,变量只被调用两次:一次,在启动时分配其值,然后将其值复制到另一个变量。我正在处理的代码有点复杂,我完全在这里发布,但这是它的基本概述:

class Test
    def self.initialize
        @problem_var = [ ["1 2 3", "4 5 6"], ["a b c", "d e f"], ["bar", "foo"] ]
    end

    def self.main_method(parVar)
        data = @problem_var
        result = "Lorem"

        #Iterate through subarrays
        data.each do |dataBlock|

            #Some code here

            if condition then
                #The first subarray meets the condition

                char = dataBlock[1]

                #At this point char is equal to "4 5 6"
                #@problem_var still holds its original value of:
                # [ ["1 2 3", "4 5 6"], ["a b c", "d e f"], ["bar", "foo"] ]

                result = OtherModule.replace_six(char)

                #By this point, char is now equal to "4 5 7"
                #Curiously @problem_var is now equal to:
                # [ ["1 2 3, "4 5 7"], ["a b c", "d e f"], ["bar", "foo"] ]
            end
        end

        #More code here

        return result
    end 
end

result分配了值之后,变量发生了奇怪的变化。此外,这似乎只发生一次,如果代码再次运行并改变7说... 8,@problem_var将不会更新。将@problem_var更改为常量无法阻止其被更改。过去两周我一直在仔细研究这个问题,但一直未能弄明白。有人知道会发生什么吗?

修改 你们是对的!问题出在OtherModule中。我在收到gsub!的参数变量上使用char。以下是用于将来参考的简化OtherModule代码:

module OtherModule
    def replace_six(input)
        modified_string = "" 

        if condition(input) then
           #Input meets condition
           first_string = replace_numbers(input)

           #The following method doesn't really apply here
           second_string = replace_letters(first_string)

           modified_string = second_string
        end

        return modified_string
    end

    def replace_numbers(text)

        #Some code here

        #The following condition for numbers in `text`
        if condition(text) then
            text.gsub!("6", numberFunction)
            #numberFunction returns a string
        end
        return text
    end
end

1 个答案:

答案 0 :(得分:0)

OtherModule.replace_six中最有可能出现问题。 如果它使用String#replace方法,则String变异,并且在保持对它的引用的任何地方都可以看到它的效果。

如果您无法访问OtherModule的代码,请执行以下操作:

 result = OtherModule.replace_six(char.dup)

如果您有权访问OtherModule的代码,请更改replace_six的实施,使其使用String#subString#gsub,因为它们会返回修改了字符串而不是改变原始字符串。