2017-09-24 92 views
-1

如何使我的代码工作,以便balance属性不直接访问实例变量(我相信它是@balance)?有人可以解释一个属性的含义访问一个实例变量?如何让我的类属性不能直接访问实例变量?

我刚刚开始使用Ruby,刚刚学习了Ruby类。在本章中,我的目标是理解实例变量的概念,向我们展示getter和setter方法,了解如何使用实例方法以及理解封装的概念。

class BankAccount 
    attr_accessor :balance 

    def initialize(balance) 
    @balance = balance 
    end 

    def withdraw(amount) 
    if (balance >= amount) 
     @balance = balance - amount 
    end 
    end 
end 
+1

只要删除'attr_accessor'并添加您的'balance'方法的版本。 –

+1

顺便说一句,从你的代码中不明显__at all__,你为什么要'balance'不读'@ balance'。 –

+0

您将“余额属性”与“余额实例变量”区分开来,并且该部分很混乱。澄清问题:您是否使用Rails进行编程,并且是数据库表中列的“余额属性”?否则,就像@SergioTulentsev指出的那样,为什么你想要有一个区别并不明显。由'attr_accessor:balance'创建的getter和setter方法被SUPPOSED来获取和设置实例变量(它是@balance)。 – Isaac

回答

1

在Ruby attr_reader :balance或多或少只是以下方法的便利版本:

def balance 
    @balance 
end 

同样,attr_writer :balance仅仅是

def balance=(value) 
    @balance = value 
end 

attr_accessor :balance的简写形式是短期的attr_reader :balanceattr_writer :balance

因此,你可以看到attr_reader访问实例变量没有什么特别的,例如,在您的代码中,您还可以访问#initalize#withdraw中的实例变量。

你需要说明为什么你不想直接访问它。而这甚至意味着什么。因为你可以使用@balance访问实例变量,在我看来,没有间接

0

定义自己的balance阅读方法的版本:

class BankAccount 
    attr_accessor :balance 

    def initialize(balance) 
    @balance = balance 
    end 

    def withdraw(amount) 
    if (balance >= amount) 
     @balance = balance - amount 
    end 
    end 

    def balance 
    'balance from method directly' 
    end 
end 

现在当你调用balance方法,它会相应地读你定义一个和返回值。