class Account
attr_reader :name
attr_reader :balance
def initialize(name, balance=100)
@name = name
@balance = balance
end
public
def display_balance(pin_number)
if pin_number == pin
puts "Balance: $#{@balance}."
else
puts pin_error
end
end
def withdraw(pin_number,amount)
if pin_number == @pin
@balance -= amount
puts "Withdrew #{amount}."
else
puts pin_error
end
end
def deposit(pin_number,amount)
if pin_number ==@pin
@balance+=amount
puts"Deposited"
else
puts pin_error
end
end
private
def pin
@pin = 1
end
def pin_error
return "Access denied: incorrect PIN."
end
end
checking_account=Account.new("bob",200)
checking_account.deposit(1,20)
当我尝试存款时,我在引脚上出现错误,但是当我在引脚检查中删除@并将其视为正常变量时,它可以工作。在codeacademy中,它显示了检查引脚的正确方法
if pin_number==@pin
但它不起作用,即使它应该,为什么呢?
pin_number==@pin
将返回false
,因为你从未设置@pin
- 所以它仍然是nil
。
您可以执行以下操作,而不是使用私有方法:
def initialize(name, pin, balance=100)
@name = name
@pin = pin
@balance = balance
end
# ...
checking_account=Account.new("bob", 1, 200)
checking_account.deposit(1, 20)
但它不起作用,即使它应该,为什么呢?
因为你的@pin
从未被初始化。你的代码和它们在codecademy上的东西之间必须有所不同(它们可能在初始化程序中初始化@pin
,而你没有)。
但是当我在引脚检查中删除@并将其视为正常变量时
错了..这不是一个变数。当你制作pin
而不是@pin
时,它开始指向你的私有方法。返回一个密码。这就是它的原因。
请注意,如果您在存款之前只是display_balance
,那么您的代码将按原样运行。这称为“呼叫顺序依赖”,这很糟糕。