Строка Ruby для оператора

У меня есть массив

operator = ['+', '-', '*', '/']

И я хочу использовать их для решения уравнения по-разному. Я предполагаю, что это будет примерно так:

operator.map {|o| 6 o.to_sym 3 } # => [9, 3, 18, 2]

Как это сделать?

Ответ 1

Сделайте, как показано ниже, с помощью Object#public_send:

operator = ['+', '-', '*', '/']
operator.map {|o| 2.public_send o,2 }
# => [4, 0, 4, 1]

Еще один способ: Object#method и Method#call:

operator = ['+', '-', '*', '/']
operator.map {|o| 2.method(o).(2) }
# => [4, 0, 4, 1]

Ответ 2

Другой способ сделать это - использовать try. Вероятно, причина в том, что try - более защитная версия отправки.

def try(*a, &b)
  if a.empty? && block_given?
    yield self
  else
    __send__(*a, &b)
  end
end

Выполнение этого с помощью try будет выглядеть так:

operator = ['+', '-', '*', '/']
val_to_be_operated = nil

operator.map { |v| val_to_be_operated.try(v, 2) } 
# => [nil, nil, nil, nil]
operator.map { |o| val_to_be_operated.method(o).(2) } 
# Error

val_to_be_operated = 2 
operator.map { |v| val_to_be_operated.try(v, 2) }
# => [4, 0, 4, 1]