我的代码中的实例变量继续重新分配其值,尽管没有命令这样做。本质上,变量只被调用两次:一次,在启动时分配其值,然后将其值复制到另一个变量。我正在处理的代码有点复杂,我完全在这里发布,但这是它的基本概述:
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
答案 0 :(得分:0)
OtherModule.replace_six
中最有可能出现问题。
如果它使用String#replace
方法,则String变异,并且在保持对它的引用的任何地方都可以看到它的效果。
如果您无法访问OtherModule
的代码,请执行以下操作:
result = OtherModule.replace_six(char.dup)
如果您有权访问OtherModule
的代码,请更改replace_six
的实施,使其使用String#sub
或String#gsub
,因为它们会返回修改了字符串而不是改变原始字符串。