Давайте разберем ваш пример на что-то более простое:
num1 = 1
num2 = 2
op = '+'
result = num1 + op + num2
Когда вы пытаетесь назначить result
, на самом деле происходит следующее:
result = 1 + '+' + 2
Ruby сообщает String can't be coerced into Integer
, потому что он пытается добавить строку +
к целому числу 1
, а Ruby не может добавить строку к целому числу. Вы можете узнать больше об этом в String не может быть преобразован в Fixnum (TypeError) .
Вы можете воспроизвести это с еще более простым примером:
1 + '+'
TypeError: String can't be coerced into Integer
В вашем вопросе вы говорите , он должен выполнить расчет с использованием этих переменных , поэтому я предполагаю, что вы ожидаете, что result
будет равно 3
. (потому что он должен вычислять 1 + 2
из трех переменных) Это не то, что происходит в вашей строке result = ...
по причинам, описанным выше.
Правильный способ сделать это - использовать public_send
, как описано в эти другие вопросы и ответы здесь, в Stack Overflow:
Таким образом, ответ:
num1.public_send(op, num2)
=> 3
И интегрировано в ваш пример:
if operators.include?(op)
result = num1.public_send(op, num2)
else
puts "enter a valid operator"
end