是否可以将算术运算符(*,+, - ,/)作为参数传递给ruby方法?我已经看到这在C ++中执行。轨道能够类似吗?
def calculate(operator)
1254 operator 34
end
puts calculate(+)
答案 0 :(得分:6)
您可以使用块,并执行类似
的操作def calculate
yield 1254,34
end
calculate &:+ # => 1288
答案 1 :(得分:5)
使用Object#send
:
def calculate(op)
1254.send(op, 34)
end
puts calculate(:+)
这适用于任何方法,包括定义的算术运算符。请注意,您需要将方法名称作为符号或字符串发送。
答案 2 :(得分:4)
操作员不喜欢消息。因此,您可以传递一个符号来命名您要发送的邮件。
def calculate(operator)
1254.send(operator, 34)
end
# to call:
puts calculate(:+)
当然,请注意,这将允许您调用任何方法,因此,如果您在执行此类操作时将接受用户输入,则通常会想要列入白名单。
答案 3 :(得分:2)
您可以使用Object#send
或Object#public_send
方法实现此目的:
def calculate(operator)
# specify accepted operators here:
raise ArgumentError unless [:*, :+, :-, :/].include? operator.to_sym
1254.public_send(op, 34)
end