2017-03-26 6 views
0

Grundsätzlich muss ich von einem meiner Variable variable_position jedes Mal erhöhen, wobei das Verfahren set_variable_value genannt wird, so dass jeder bin_val Variable durch diese Methode erstellt mit einer anderen inkrementalen variable_position Parameter von 16. Start erstellt wirdRuby, wie man eine Instanzvariable von einer anderen Methode ändert?

Rechts wissen, es geht von 15 (siehe Methode initialize) bis 16 im ersten Methodenaufruf, aber dann bleibt ich bei 16, egal wie oft die Methode aufgerufen wird.

require "./my_math.rb" 
    class Rules 
     attr_accessor :variable_position 
     JUMP_ARR = [";JGT", ";JEQ", ";JGE", ";JLT", ";JNE", ";JLE", ";JMP"] 

     def initialize 
     @variable_position = 15 
     end 

     # A instructions have to be 16 bit long 
     def self.a_16_bit (line) 
     a_rules = Rules.new 
     if line[1] == 'R' 
      bin_val = a_rules.set_reserved_variable_value(line) 
     elsif (/^[[:alpha:]]+$/).match(line[1..line.length]) 
      bin_val = a_rules.set_variable_value #HERE IS WHERE I CALL THE METHOD 
     else 
      bin_val = MyMath.to_binary(line[1..line.length]) 
     end 
     n = bin_val.to_s.length 
     m = 16 - n 
     complete_number = ("0"*m) + bin_val.to_s 
     end 

     def set_variable_value 
     @variable_position += 1 #HERE IS WHERE I TRY TO INCREASE THE VALUE 
     bin_val = MyMath.to_binary(@variable_position) 
     end 
    end 

Vielen Dank für das Lesen.

+0

Bitte teilen Sie den Anrufer-Code. Diese Klasse sieht gut aus. – mudasobwa

+0

@mudasobwa ist richtig in der self.a_16_bit Methode; Ich habe einen Kommentar hinzugefügt, damit Sie es einfacher finden können –

+1

@SebastianDelgado nach dem Aufruf von ':: a_16_bit' wird ein neues' Rules'-Objekt erstellt. Jedes Mal, wenn Sie diese Methode aufrufen, initialisieren Sie ein neues Objekt mit einer neuen Instanzvariablen. Außerdem rufst du es nur einmal innerhalb von ':: a_16_bit' an, so dass es sich nur um' 1' ändern kann. Vielleicht sollte '@ variable_position' eine Klasseninstanzvariable sein? – DiodonHystrix

Antwort

1

Sie keine Instanz des Objekts überhaupt benötigen:

require "./my_math.rb" 
class Rules 
    JUMP_ARR = [";JGT", ";JEQ", ";JGE", ";JLT", ";JNE", ";JLE", ";JMP"] 

    @variable_position = 15 

    # A instructions have to be 16 bit long 
    def self.a_16_bit (line) 
    bin_val = if line[1] == 'R' 
       # code from set_reserved_variable_value(line) here 
       elsif (/^[[:alpha:]]+$/).match(line[1..line.length]) 
       MyMath.to_binary(@variable_position += 1) 
       else 
       MyMath.to_binary(line[1..line.length]) 
       end 
    n = bin_val.to_s.length 
    m = 16 - n 
    complete_number = ("0"*m) + bin_val.to_s 
    end 
end 

In Ihrem aktuellen Code, den Sie mit Instanzvariablen und Klassenmethoden sind in Unordnung.

+0

Danke für Ihre Hilfe –

2

Wenn Sie a_rules = Rules.new aufrufen, erstellen Sie eine neue Instanz von Rules. Der Konstruktor initialize setzt den Wert @variable_position für jede Instanz auf 15. Wenn Sie die Methode bin_val = a_rules.set_variable_value aufrufen, wird der Wert @variable_position einmal erhöht, weil Sie noch an derselben Instanz arbeiten.

Ich schlage vor, dass @variable_position sollte eine Klassenvariable sein. Auf diese Weise wird der Wert jedes Mal nicht zurückgesetzt, wenn Sie ein neues Objekt einfügen.

+0

Danke für Ihre Hilfe –

Verwandte Themen