4

是否可以将算术运算符(*、+、-、/)作为参数传递给 ruby​​ 方法?我已经看到这是在 C++ 中执行的。rails 有类似的功能吗?

def calculate(operator)
   1254 operator 34
end

puts calculate(+)
4

4 回答 4

7

使用Object#send

def calculate(op)
  1254.send(op, 34)
end

puts calculate(:+)

这适用于任何方法,包括定义的算术运算符。请注意,您需要将方法名称作为符号或字符串发送。

于 2013-06-20T19:12:52.523 回答
6

你可以使用一个块,并做类似的事情

def calculate
  yield 1254,34
end
calculate &:+ # => 1288
于 2013-06-20T19:17:10.317 回答
4

操作员对消息进行脱糖。因此,您可以传递一个符号来命名您要发送的消息。

def calculate(operator)
    1254.send(operator, 34)
end

# to call:
puts calculate(:+)

请注意,当然,这将允许您调用任何方法,因此,如果您在执行此类操作时要接受用户输入,通常需要将其列入白名单。

于 2013-06-20T19:14:36.680 回答
2

Object#send您可以使用orObject#public_send方法实现此目的:

def calculate(operator)
  # specify accepted operators here:
  raise ArgumentError unless [:*, :+, :-, :/].include? operator.to_sym
  1254.public_send(op, 34)
end
于 2013-06-20T19:15:23.563 回答