2013-06-02 56 views
0

我正在研究一個RPN計算器,並認爲我幾乎在那裏,除了它返回的表達式不是解決方案。試圖評估一個表達式

def evaluate(expression) 
    expression = expression.split 

    operators = expression.select { |v| v =~ /\W/} 
    operands = expression.select { |v| v =~ /\d/} 

    new_expression = operands.zip(operators) 
    eval = new_expression.join 
end 

這應返回-7

puts evaluate('5 8 + 4 - 5 *') 
#=> 5+8-4*5 
+2

您不能以這種方式獲得運算符優先權。正確的結果需要是45,而不是-7。 –

回答

1
eval = new_expression.join 

這就要求new_expression.join並將結果保存在一個名爲eval一個局部變量。因爲你永遠不使用局部變量,你可能也只是採寫:

new_expression.join 

如果這是你有意者來電Ruby的eval法的new_expression.join作爲其參數的結果,你應該刪除賦值運算符:

eval new_expression.join 

這就是說如果您只評估受信任的輸入,使用eval來評估表達式只是一個好主意。

0

您正在創建一個名爲eval一個局部變量,但你真的想打電話給Kernel#eval與表達作爲參數,像這樣:

eval operands.zip(operators).join 
1

這不正是你寫什麼,我。即它給變量eval提供了字符串。解決方案:

def evaluate(expression) 
    expression = expression.split 

    operators = expression.select { |v| v =~ /\W/} 
    operands = expression.select { |v| v =~ /\d/} 

    new_expression = operands.zip(operators) 
    eval new_expression.join 
end 

puts evaluate('5 8 + 4 - 5 *')