Строка 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]
Ответ 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]