如何使我的 class 属性无法直接访问实例变量?
How do I make my class attribute not be able to access instance variable directly?
我怎样才能使我的代码工作,以便 balance 属性不直接访问实例变量(我相信它是@balance)?有人可以解释 access 实例变量的属性的含义吗?
我是 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
定义您自己的 balance
reader 方法版本:
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
方法时,它会读取您定义的方法和相应的 return 值。
在Ruby中attr_reader :balance
或多或少只是以下方法的一个方便版本:
def balance
@balance
end
同样,attr_writer :balance
只是
的缩写形式
def balance=(value)
@balance = value
end
而attr_accessor :balance
是attr_reader :balance
加attr_writer :balance
的缩写。
所以你可以看到attr_reader
访问实例变量没有什么特别的,例如在您的代码中,您还可以访问 #initalize
和 #withdraw
.
中的实例变量
您需要说明您不想直接访问它的原因。这甚至意味着什么。因为您可以使用 @balance
或不使用来访问实例变量,所以我认为没有 indirect。
我怎样才能使我的代码工作,以便 balance 属性不直接访问实例变量(我相信它是@balance)?有人可以解释 access 实例变量的属性的含义吗?
我是 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
定义您自己的 balance
reader 方法版本:
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
方法时,它会读取您定义的方法和相应的 return 值。
在Ruby中attr_reader :balance
或多或少只是以下方法的一个方便版本:
def balance
@balance
end
同样,attr_writer :balance
只是
def balance=(value)
@balance = value
end
而attr_accessor :balance
是attr_reader :balance
加attr_writer :balance
的缩写。
所以你可以看到attr_reader
访问实例变量没有什么特别的,例如在您的代码中,您还可以访问 #initalize
和 #withdraw
.
您需要说明您不想直接访问它的原因。这甚至意味着什么。因为您可以使用 @balance
或不使用来访问实例变量,所以我认为没有 indirect。