红宝石中有这样的东西吗?
send(+, 1, 2)
我想让这段代码看起来不那么多余
if op == "+"
return arg1 + arg2
elsif op == "-"
return arg1 - arg2
elsif op == "*"
return arg1 * arg2
elsif op == "/"
return arg1 / arg2
答案 0 :(得分:13)
是的,只需使用send
(或者,更好的是public_send
),就像这样:
arg1.public_send(op, arg2)
这是有效的,因为Ruby中的大多数运算符(包括+
,-
,*
,/
,and more)只是调用方法。因此1 + 2
与1.+(2)
相同。
如果是用户输入,您可能还希望将op
列入白名单,例如%w[+ - * /].include?(op)
,否则用户将能够调用任意方法(这是一个潜在的安全漏洞)。
答案 1 :(得分:1)
作为另一种选择,如果你的运算符和操作数恰好是字符串格式,比如gets
方法,你也可以使用eval
:
例如:
a = '1'; b = '2'; o = '+'
eval a+o+b
变为
eval '1+2'
返回3