2016-03-24 2 views
-1

ich diese Methode in einer Klasse Wroe:Ruby-Interpreter ignors Bedingungen elsif Aussagen

def OpCodes 
    if @asm[0] == "ADD" 
    opcode = "111" 
    elsif @asm[0] == "CMP" 
    opcode = "110" 
    elsif @asm[0] == "SHL" 
    opcode = "101" 
    elsif @asm[1] == "SHR" 
    opcode = "100" 
    elsif @asm[1] == "NOT" 
    opcode = "011" 
    elsif @asm[1] == "XOR" 
    opcode = "010" 
    elsif @asm[1] == "OR" 
    opcode = "001" 
    elsif @asm[1] == "AND" 
    opcode = "000" 
    else 
    opcode = "ERROR" 
    end 
    @opcode = opcode 
    return @opcode 
end 

Und wenn ich den Code ausführen, und zum Beispiel gebe ich es "ADD 1, 3" string, es funktioniert und kehrt "111". Aber, wenn ich andere Befehle verwenden, es gibt „ERROR“

+0

'" ADD 1, 3 "[0]' ist 'A' und sollte nicht mit' ADD' identisch sein. Gibst du wirklich die Zeichenfolge "ADD 1, 3" oder gibt es eine Trennung und du gibst ein Array? Können Sie bitte Ihren Anruf in Ihrem Beispiel hinzufügen. – knut

+0

Es tut mir leid, was ruby ​​Interpreter ignoriert? Vielleicht ignorierst du an erster Stelle die Ruby-Syntax? –

+0

Willkommen bei SO. Bitte lesen Sie "[mcve]". Ihr Code wird nicht so ausgeführt, wie er ist, was es für uns schwieriger macht, Ihnen zu helfen. –

Antwort

2

Man könnte dies umschreiben eine einfache Lookup-Tabelle zu verwenden:

OPCODES = { 
    ADD: 0b111, 
    CMP: 0b110, 
    SHL: 0b101, 
    SHR: 0b100, 
    NOT: 0b011, 
    XOR: 0b010, 
    OR: 0b001, 
    AND: 0b000 
}.freeze 

OPCODE_ERROR = "ERROR".freeze 

def opcode(instruction) 
    OPCODES[instruction.to_sym] or OPCODE_ERROR 
end 

Hinweis es viel besser ist, verwenden nativen Binärzahlen als String Darstellungen derselben, also verwende ich die 0bNNN Schreibweise hier. 0b001 ist 1, 0b010 ist 2. Sie können zurück in eine Zeichenfolge konvertieren, wenn Sie n.to_s(2) für Base-2 verwenden möchten.

Zusätzlich sollten Sie niemals Methoden CamelCase style nennen, die für Klassen- und Modulnamen reserviert sind. Verwenden Sie stattdessen underscore_style.

Es sieht so aus, als würden Sie Ihre Eingaben nicht richtig analysieren. Versuchen Sie es mit einem regulären Ausdruck:

instruction, a, b = input.scan(/\A(\S+)\s+(\S+),\s*(\S+)/)[0] 

Für so etwas wie "ADD 1,2" werden Sie diese Werte in drei Variablen erhalten ausgebrochenen Sie verwenden können.