Reputation: 19506
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
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
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