MxLDevs
MxLDevs

Reputation: 19506

Can I dynamically call a math operator in Ruby?

Is there something like this in ruby?

send(+, 1, 2)

I want to make this piece of code seem less redundant

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

Upvotes: 7

Views: 3195

Answers (2)

frank
frank

Reputation: 305

As an other option, if your operator and operands happen to be in string format, say from a gets method, you can also use eval:

For example:

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

eval a+o+b

becomes

eval '1+2'

which returns 3

Upvotes: 1

Andrew Marshall
Andrew Marshall

Reputation: 96934

Yup, simply use send (or, better yet, public_send) like so:

arg1.public_send(op, arg2)

This works because most operators in Ruby (including +, -, *, /, and more) simply call methods. So 1 + 2 is the same as 1.+(2).

You may also want to whitelist op if it’s user input, e.g. %w[+ - * /].include?(op), as otherwise the user will be able to call arbitrary methods (which is a potential security vulnerability).

Upvotes: 17

Related Questions