2013-06-02 3 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 

Если это ваше намерение вызвать 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 *') 
Смежные вопросы