在Ruby中引用属性

在Ruby中引用属性,ruby,Ruby,有人能解释一下为什么写:将acc render 15作为结果,但这一行: puts acc.balance不起作用,它表示未定义的方法balance,但它不是一个方法,它应该被视为一个属性/属性 提前感谢acc-=5相当于acc=acc-5 按账户法计算,acc-5为15;acc=acc-5类似于acc=15 现在acc是Fixnum对象 如何实现+,-如下所示 class Account attr_accessor :balance def initialize (amoun

有人能解释一下为什么写:将acc render 15作为结果,但这一行: puts acc.balance不起作用,它表示未定义的方法balance,但它不是一个方法,它应该被视为一个属性/属性 提前感谢

acc-=5相当于acc=acc-5

按账户法计算,acc-5为15;acc=acc-5类似于acc=15

现在acc是Fixnum对象

如何实现+,-如下所示

class Account
    attr_accessor :balance

    def initialize (amount=0)
        self.balance = amount
    end

    def -(x)
        self.balance -= x
    end

    def +(x)
        self.balance += x
    end 

    def to_s
        puts "Balance is #{self.balance} !!!!!!!!!"
    end


end

acc = Account.new(20)
acc -=5

错误的来源是行

def -(x)
    Account.new(self.balance - x)
end

def +(x)
    Account.new(self.balance + x)
end 
它将减法方法的结果返回值分配给acc变量,该结果是未定义balance方法的Fixnum实例

如果希望+和-方法返回帐户实例,则需要指定:

acc -= 5
等等


顺便说一句,Ruby中的访问器是方法

您希望编辑两个方法,使+=和-=工作,以便它们将对象返回原位:

def +(x)
  self.balance += x
  self
end

通过这种方式,它将对象重新分配给它自己。

哎呀,这个对象有很多地方出了问题。我无法解释所有问题,但让我们看看我能走多远:

首先,您已经重新定义了+和-方法,为它们提供了+=和-=所期望的语义。鉴于此:如果您在示例中使用acc-5而不是acc-=5,则行为接近您的预期,irb将显示15,因为这是您的-方法的结果,该方法的副作用是减去平衡的5

然而,在您的示例中,当您调用-=时,ruby解释器最终会将方法result Fixnum 15分配给acc变量。当您尝试访问帐户类上定义的余额时,这将为您提供错误消息NoMethodError:undefined方法“balance”,该方法用于15:Fixnum

方法应该返回Account对象,而不是更改对象的现有状态并将结果作为Fixnum返回。有关如何重新定义运算符的示例,请参见。我知道这在某种程度上违背了您的目的,因为您希望使用-=来修改对象,但它只能通过在Ruby中创建另一个帐户实例来工作,因为您无法重新定义-=直接查看上面的链接


当然,您可以自由定义取款方法以获得所需的语义。

我知道-方法用于从经常账户余额中取款,因此对结果15并不感到意外。但还是不明白为什么放acc.balance不起作用。平衡不是每个实例的属性吗?也许我的语法错了。谢谢。@Sam,根据您的代码,-,+方法的返回值是Fixnum,而不是Balance实例。@Sam,我添加了-,+的替代实现;它返回一个新的帐户实例而不是Fixnum。@Sam您必须知道,以这种方式实现的方法将返回新的帐户实例,而原始self不受影响。我知道,这是有意的。想想account1+5。以您的方式实施,它会改变account1的余额。通常这是意外的副作用。attr_访问器在这里的作用是什么?为什么不直接使用@balance呢?
def -(x)
    self.balance -= x
    self
end

def +(x)
    self.balance += x
    self
end