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),否则用户将能够调用任意方法(这是一个潜在的安全漏洞).
| 归档时间: |
|
| 查看次数: |
2089 次 |
| 最近记录: |