Can I dynamically call a math operator in Ruby?

后端 未结 2 409
鱼传尺愫
鱼传尺愫 2020-12-04 01:52

Is there something like this in ruby?

send(+, 1, 2)

I want to make this piece of code seem less redundant

if op == \"+\"
           


        
相关标签:
2条回答
  • 2020-12-04 02:35

    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

    0 讨论(0)
  • 2020-12-04 02:42

    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).

    0 讨论(0)
提交回复
热议问题