【问题标题】:Can I dynamically call a math operator in Ruby?我可以在 Ruby 中动态调用数学运算符吗?
【发布时间】:2012-10-15 03:27:07
【问题描述】:

在 ruby​​ 中有这样的东西吗?

send(+, 1, 2)

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

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

【问题讨论】:

    标签: ruby reflection metaprogramming


    【解决方案1】:

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

    arg1.public_send(op, arg2)
    

    这是可行的,因为 Ruby 中的大多数运算符(包括+-*/and more)只是调用方法。所以1 + 21.+(2) 是一样的。

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

    【讨论】:

    • %w 表示法是什么?或者它只是比["+", "-", ... ].include?(op)更干净@
    • %w[a b c] 等价于 ['a', 'b', 'c'] - 它只是字符串数组(由空格分隔的元素)的简写。
    • 是否有解决方案可以让 += 运算符也能正常工作?
    • @burningpony 你不能send 运营商,只有方法,所以不行。但是没有理由不直接使用 send 的返回值进行显式赋值。
    【解决方案2】:

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

    例如:

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

    eval a+o+b

    变成

    eval '1+2'

    返回3

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2022-12-21
      相关资源
      最近更新 更多