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
4

3 回答 3

1
eval = new_expression.join

这会调用new_expression.join并将结果存储在名为 的局部变量中eval。由于您从不使用该局部变量,因此您也可以编写:

new_expression.join

如果您打算使用作为参数eval的结果来调用 Ruby 的方法,则new_expression.join应该删除赋值运算符:

eval new_expression.join

也就是说eval,如果您只评估受信任的输入,那么使用评估表达式只是一个好主意。

于 2013-06-02T20:44:31.327 回答
1

它完全按照您所写的进行,即它eval使用给定的 String 来生成变量。解决方案:

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 *')
于 2013-06-02T20:45:49.167 回答
0

您正在创建一个名为 的局部变量eval,但您确实想Kernel#eval使用表达式作为参数进行调用,如下所示:

eval operands.zip(operators).join
于 2013-06-02T20:44:58.413 回答