2016-01-29 3 views
-1

Переменная экземпляра в моем коде продолжает переопределяться, несмотря на то, что для этого не было никаких команд. По существу, переменная вызывается только дважды: один раз, чтобы назначить ее значение при запуске, а затем скопировать ее значение в другую переменную. Код, я работаю на это немного сложно для меня, чтобы разместить его здесь полностью, но это основное изложение его:Ruby - переменная переменной экземпляра сама по себе

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 имеет значение, присвоенное ему. Кроме того, это, похоже, происходит только однажды, так что, если код должен был запускаться снова и изменить его, чтобы сказать ... 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

Похоже, метод replace_six изменяет переданное ему значение –

+0

Поделитесь кодом 'OtherModule.replace_six (char)' –

ответ

0

Проблема, скорее всего, в OtherModule.replace_six. Если он использует метод String#replace, то String мутируется, и его эффект будет виден везде, когда ссылка на его сохранена.


Если у вас нет доступа к коду OtherModule, то сделать это:

result = OtherModule.replace_six(char.dup) 

Если у вас есть доступ к коду OtherModule, то изменить реализацию replace_six такого что он использует либо String#sub, либо String#gsub, так как они возвращают копию измененной строки вместо изменения исходной строки.

Смежные вопросы