如何使我的类属性无法直接访问实例变量?

时间:2017-09-24 05:14:07

标签: ruby instance-variables

如何让我的代码工作,以便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

2 个答案:

答案 0 :(得分:1)

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

def balance
  @balance
end

同样,attr_writer :balance只是

的缩写形式
def balance=(value)
  @balance = value
end

attr_accessor :balanceattr_reader :balance加上attr_writer :balance的缩写。

因为您可以看到attr_reader 访问,实例变量并不特别,例如在您的代码中,您还可以访问#initalize#withdraw中的实例变量。

您需要澄清为什么不想直接访问它。甚至意味着什么。因为您可以使用@balance访问实例变量,所以我认为没有间接

答案 1 :(得分: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方法时,它会读取您定义的方法并相应地返回值。