Ruby中能否传±符号为方法参数?如何重构类的加减运算符方法?
如何在Ruby中复用加减运算符的逻辑
当然可以实现这种复用逻辑!咱们先搞清楚Ruby里的+和-到底是什么——它们本质上就是特殊的方法名,Ruby允许用这些符号作为方法名,但你没法直接把+或者-当作参数传递,不过我们有几种优雅的方式来解决这个问题:
方法一:用符号配合send方法
这是最简洁的方式,利用Ruby的send方法可以接收方法名(符号形式)来调用对应方法的特性:
class A attr_reader :a def initialize(a) @a = a end # 通用运算方法 def operation(op_symbol, instance_of_a) A.new(self.a.send(op_symbol, instance_of_a.a)) end # 重写+运算符,复用通用逻辑 def +(instance_of_a) operation(:+, instance_of_a) end # 重写-运算符,复用通用逻辑 def -(instance_of_a) operation(:-, instance_of_a) end end
这里的send(op_symbol, instance_of_a.a)相当于直接调用self.a + instance_of_a.a(当op_symbol是:+时),完美复用了运算逻辑。
方法二:用Proc传递运算逻辑
如果你需要更灵活的运算(比如以后要加自定义运算),可以用Proc(代码块对象)来传递具体的运算逻辑:
class A attr_reader :a def initialize(a) @a = a end def operation(operation_proc, instance_of_a) A.new(operation_proc.call(self.a, instance_of_a.a)) end def +(instance_of_a) # 用lambda定义加法逻辑 operation(->(x, y) { x + y }, instance_of_a) end def -(instance_of_a) # 用lambda定义减法逻辑 operation(->(x, y) { x - y }, instance_of_a) end end
这种方式扩展性更强,哪怕以后要实现乘法、除法甚至更复杂的自定义运算,只需要传递对应的Proc即可。
补充:关于Ruby运算符的小知识
你之前尝试直接写+作为参数或者-.class.name失败,是因为+/-作为运算符时,Ruby会把它当成语法符号,而不是一个可传递的对象。如果你想获取这个方法的对象,可以用method(:+)或者method(:-):
# 获取加法方法对象 add_method = 1.method(:+) puts add_method.class.name # 输出 "Method" puts add_method.call(2) # 输出 3 # 你也可以在类内部这样用 def test_subtract minus_method = self.a.method(:-) puts minus_method.call(5) # 假设self.a是10的话,输出5 end
这样就能拿到运算符对应的方法对象,然后通过call方法调用它。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

