7

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

send(+, 1, 2)

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

if op == "+"
  return arg1 + arg2
elsif op == "-"
  return arg1 - arg2
elsif op == "*"
  return arg1 * arg2
elsif op == "/"
  return arg1 / arg2
4

2 回答 2

17

是的,只需像这样使用send(或者,更好的是public_send):

arg1.public_send(op, arg2)

这是因为 Ruby 中的大多数运算符(包括+-*/等)只是简单地调用方法。所以1 + 2是一样的1.+(2)

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

于 2012-10-25T01:16:02.027 回答
1

作为另一种选择,如果您的运算符和操作数恰好是字符串格式,例如从gets方法中,您还可以使用eval

例如:

a = '1'; b = '2'; o = '+'

eval a+o+b

变成

eval '1+2'

返回3

于 2017-08-23T19:00:53.097 回答