首页 > 解决方案 > 带有多个参数的 Ruby 重载运算符

问题描述

我有一个包含两个字段(钱包和美分)的 MoneyBox 类。我需要使用这些字段重载 +、- 和 * 操作。如何用两个参数正确实现这些运算符的重载?

class MoneyBox
  attr_accessor :wallet, :cent

  def initialize(wallet, cent)
  @wallet = wallet  
  @cent = cent 
   
  end

  def + (obj, obj_cent)
    self.wallet = self.wallet + obj.wallet
    self.cent = self.cent + obj_cent.cent
    return self.wallet, self.cent 
  end

  def - (obj, obj_cent) 
    self.wallet = self.wallet - obj.wallet
    self.cent = self.cent - obj_cent.cent
    return self.wallet, self.cent 
  end

  def * (obj,obj_cent) 
    self.wallet = self.wallet * obj.wallet
    self.cent = self.cent * obj_cent
    return self.wallet, self.cent 
  end

end

它应该是这样的:

Cash1 = MoneyBox.new(500, 30)
Cash2 = MoneyBox.new(100, 15)

puts " D1 = #{D1 = (Cash1-(Cash2*2))}" # 500,30 - 100,15*2 = 300,0

标签: rubyoperator-overloading

解决方案


x + y如果要重载运算符以获取两个参数,则不能使用典型语法。

相反,您必须使用.+,请参阅以下内容:

class Foo
  def initialize(val)
    @val = val
  end
   
  def +(a,b)
    @val + a + b
  end
end

foo = Foo.new(1)

foo.+(2,3)
# => 6

推荐阅读