Можно ли динамически вызывать математический оператор в Ruby?

Есть ли что-то подобное в рубине?

send(+, 1, 2)

Я хочу, чтобы этот кусок кода казался менее избыточным

if op == "+"
  return arg1 + arg2
elsif op == "-"
  return arg1 - arg2
elsif op == "*"
  return arg1 * arg2
elsif op == "/"
  return arg1 / arg2

Ответы на вопрос(2)

Решение Вопроса

Да, просто используйтеsend (или, еще лучше,public_send) вот так:

arg1.public_send(op, arg2)

Это работает, потому что большинство операторов в Ruby (включая+, -, *, /, и болееПросто вызовите методы. Так1 + 2 такой же как1.+(2).

Вы также можете хотеть белый списокop если это пользовательский ввод, например%w[+ - * /].include?(op), иначе пользователь сможет вызывать произвольные методы (что является потенциальной уязвимостью безопасности).

 Andrew Marshall26 апр. 2014 г., 04:47
@burningpony Вы не можетеsend операторы, только методы, поэтому нет. Но нет причины не просто делать явное присваивание, используя возвращаемое значениеsend.
 That Umbrella Guy25 окт. 2012 г., 03:40
Что это такое%w нотация? Или это просто чище, чем["+", "-", ... ].include?(op)
 oldergod25 окт. 2012 г., 03:44
Вам нужно сбежать` for the% w` на работу.
 rposborne26 апр. 2014 г., 03:34
Есть ли решение, которое позволило бы операторам + = также работать?
 Scott Olson25 окт. 2012 г., 04:16
%w[a b c] эквивалентно['a', 'b', 'c'] - это просто сокращение для массива строк (элементы, разделенные пробелами).

если ваш оператор и операнды оказываются в строковом формате, скажем, изgets метод, вы также можете использоватьeval:

Например:

a = '1'; b = '2'; o = '+'

eval a+o+b

становится

eval '1+2'

который возвращается3

Ваш ответ на вопрос