2017-03-02 35 views
2

我正在使用波蘭語/前綴表示法構建計算器,我遇到了一個特殊問題。當程序碰到一個減法運算符時,它會拋出undefined method '-' for Fixnum (NoMethodError)。這隻發生在-;加法,乘法和除法都可以正常工作。更奇怪的是,當我用irb手動調用send:-時,錯誤不會發生。該錯誤只發生在我運行我的程序時。發送使用發送' - '在Ruby中執行減法

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

你可以發佈你的'is_operator?'方法嗎?一些輸入/輸出案例也會有幫助。請參閱[我如何問一個好問題?](http://stackoverflow.com/help/how-to-ask)和[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve) –

+0

請讓我們看看你的函數的調用(你正在測試的'exp')。我們需要能夠重現您的問題來回答您。你的代碼適合'calc(「 - 2 1」)'。 – Amadan

+0

謝謝,@JustinHellreich和@Amadan。增加了'is_operator?'和失敗的情況。 – charleszardo

回答

5

不是-。當我將代碼直接粘貼到Ruby中時出現錯誤(在OS X上爲pbpaste | ruby)。

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"U+2212 MINUS SIGN,這是不一樣的熟悉U+002D HYPHEN-MINUS。後者是您按鍵盤上的-鍵和用作Fixnum#-方法名稱的字符時(通常)所獲得的字符。

如果我們這一個,它採用了常規的-替換您的字符串:

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

...它工作正常。看到它在repl.it:https://repl.it/GFH0

另一種方式來證明這個問題是這樣的:

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

你是怎麼結束了!而非- S'我不知道,但我會打賭你要麼從某個地方複製並粘貼,要麼使用的文本編輯器不適用於編程,而且它有一些「智能文本」功能,可以自動替換""「」-

爲什麼我的錯誤信息(和repl.it的)顯示"\u2212"當你的顯示"−"?也許Ruby版本(我使用2.3.1,和repl.it一樣)或者不同的行爲有所不同,具體取決於shell中設置的編碼。

+2

與大多數語言一樣,Ruby中的算術運算符來自基本的ASCII庫,而不是更新的Unicode數學範圍。我相信Perl 6允許U + 2122 MINUS SIGN作爲U + 002D HYPHEN-MINUS的同義詞,但這是唯一想到的語言。 –

+0

@MarkReed我不會把它放過Perl,但是當我嘗試'perl -e「15 - 7」'(用Perl 5)時,我得到了一個「Unrecognized character \ xE2」錯誤(0xE2是U的第一個字節UTF-8中的+2212:0xE2 0x88 0x92)。 –

+0

是的,而不是5. Perl 6已經走出了原生Unicode。 –