我可以在Ruby中动态调用数学运算符吗?

MxL*_*evs 5 ruby reflection metaprogramming

红宝石中有这样的东西吗?

send(+, 1, 2)
Run Code Online (Sandbox Code Playgroud)

我想让这段代码看起来不那么多余

if op == "+"
  return arg1 + arg2
elsif op == "-"
  return arg1 - arg2
elsif op == "*"
  return arg1 * arg2
elsif op == "/"
  return arg1 / arg2
Run Code Online (Sandbox Code Playgroud)

And*_*all 13

是的,只需使用send(或更好public_send),如下:

arg1.public_send(op, arg2)
Run Code Online (Sandbox Code Playgroud)

这工作,因为在Ruby中大多数运营商(包括+,-,*,/,和更多)简单地调用方法.所以1 + 2是一样的1.+(2).

op如果是用户输入,您可能还想要列入白名单,例如%w[+ - * /].include?(op),否则用户将能够调用任意方法(这是一个潜在的安全漏洞).

  • `%w [abc]`相当于`['a','b','c']` - 它只是字符串数组的简写(由空格分隔的元素). (2认同)