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
然而它不起作用,即使它应该,为什么呢?
答案 0 :(得分:0)
然而它不起作用,即使它应该,为什么呢?
因为您的@pin
从未初始化。您的代码与codecademy所拥有的内容之间必须有所不同(他们可能会在初始化程序中初始化@pin
,而您不会这样做。)
但是当我在引脚检查中删除@并将其视为正常变量时
<强>错误。即可。这不是变量。当你pin
代替@pin
时,它会开始指向你的私有方法。返回一个密码。这就是它起作用的原因。
请注意,如果您在存款之前只是display_balance
,那么您的代码将按原样运作。这被称为&#34;呼叫顺序依赖&#34;这很糟糕。
答案 1 :(得分:0)
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)