2017-03-02 1 views
2

Ich baue einen Rechner mit Polnisch/Präfix-Notation und ich stoße auf ein eigenartiges Problem. Wenn das Programm einen Subtraktionsoperator trifft, wird undefined method '-' for Fixnum (NoMethodError) ausgelöst. Dies geschieht nur mit -; Addition, Multiplikation und Division funktionieren alle gut. Was noch seltsamer ist, ist, dass, wenn ich send mit in Irb manuell aufrufen, der Fehler nicht auftritt. Der Fehler tritt nur auf, wenn ich mein Programm ausführe.Problem mit senden mit '-' Subtraktion in Ruby durchzuführen

def calc(exp) 
    exp = exp.split(" ") 
    operands = [] 
    exp.reverse.each do |str| 
    if is_operator?(str) 
     op1 = operands.pop 
     op2 = operands.pop 
     str = str.to_sym 
     result = op1.send str, op2 
     operands.push(result) 
    else 
     operands.push(str.to_i) 
    end 
    end 

    operands.pop 
end 

def is_operator?(char) 
    char.to_i.to_s != char 
end 

exp = "− */15 − 7 + 1 1 3 + 2 + 1 1" 
calc(exp) 

test.rb:13:in `block in calc': undefined method `−' for 7:Fixnum (NoMethodError) 
+0

Können Sie Ihre 'is_operator?' Methode posten? Einige Input/Output-Fälle wären ebenfalls hilfreich. Siehe [Wie stelle ich eine gute Frage?] (Http://stackoverflow.com/help/how-to-ask) und [Wie erstelle ich ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com)/help/mcve) –

+0

Bitte lassen Sie uns auch den Aufruf Ihrer Funktion sehen (mit welcher "exp" Sie testen). Wir müssen in der Lage sein, Ihr Problem zu reproduzieren, um Ihnen zu antworten. Ihr Code funktioniert gut für mich für 'calc (" - 2 1 ")'. – Amadan

+0

Danke, @JustinHellreich und @Amadan. 'Is_operator?' Hinzugefügt und der Fall, in dem es fehlschlägt. – charleszardo

Antwort

5

Ihre ist kein -. Hier ist der Fehler, den ich bekomme, wenn ich Ihren Code direkt in Ruby (pbpaste | ruby unter OS X) einfügen.

undefined method `"\u2212"' for 7:Fixnum 
(repl):9:in `block in calc' 
(repl):4:in `each' 
(repl):4:in `calc' 
(repl):24:in `<main>' 

"\u2212" ist U+2212 MINUS SIGN, die nicht das gleiche wie die bekannten U+002D HYPHEN-MINUS ist. Letzteres ist das Zeichen, das Sie (normalerweise) erhalten, wenn Sie die Taste - auf Ihrer Tastatur und das Zeichen, das für den Namen der Fixnum#--Methode verwendet wird, drücken.

Wenn wir die Zeichenfolge mit diesem ersetzen, die eine regelmäßige - verwendet:

exp = "- */15 - 7 + 1 1 3 + 2 + 1 1" 

... es funktioniert gut. Sehen Sie es auf repl.it: https://repl.it/GFH0

Ein anderer Weg, um das Problem zu demonstrieren, ist dies:

p 7.send("\u002d", 3) # => 4 
p 7.send("\u2212", 3) # => NoMethodError 

Wie haben Sie mit s am Ende statt - s? Ich habe keine Ahnung, aber ich würde wetten, dass Sie es entweder von irgendwoher kopieren und einfügen, oder Sie verwenden einen Texteditor, der nicht zum Programmieren gedacht ist und der einige "Smart Text" -Features hat, die z. "" mit “” und - mit .

Warum hat meine Fehlermeldung (und repl.it) "\u2212" angezeigt, als Ihre "−" zeigte? Vielleicht ein Unterschied in Ruby-Versionen (ich habe 2.3.1 verwendet, wie repl.it) oder ein anderes Verhalten abhängig von der Codierung in Ihrer Shell gesetzt.

+2

Die arithmetischen Operatoren in Ruby stammen wie in den meisten Sprachen aus dem grundlegenden ASCII-Repertoire, nicht aus den viel neueren Unicode-Mathematikbereichen. Ich glaube, Perl 6 erlaubt U + 2122 MINUS SIGN als Synonym für U + 002D HYPHEN-MINUS, aber das ist die einzige Sprache, die einem einfällt. –

+0

@MarkReed Ich hätte es nicht hinter Perl gesetzt, aber als ich'perl -e "15-7" '(mit Perl 5) ausprobiert habe, habe ich einen Fehler" Unerkanntes Zeichen \ xE2 "erhalten (0xE2 ist das erste Byte von U) +2212 in UTF-8: 0xE2 0x88 0x92). –

+0

Ja, nicht 5. Perl 6 hat sich aus dem Weg gemacht, Unicode-nativ zu sein. –