在Ruby中的实例变量中传递参数时出错
当我尝试存款时,我在pin上得到一个错误,但是当我在pin检查中删除@并将其作为正常变量处理时,它就工作了。在codeacademy中,它表明检查pin的正确方法是在Ruby中的实例变量中传递参数时出错,ruby,Ruby,当我尝试存款时,我在pin上得到一个错误,但是当我在pin检查中删除@并将其作为正常变量处理时,它就工作了。在codeacademy中,它表明检查pin的正确方法是 class Account attr_reader :name attr_reader :balance def initialize(name, balance=100) @name = name @balance = balance end public def display_balance(pin_
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)
但是它不起作用,即使它应该起作用,为什么呢
但是它不起作用,即使它应该起作用,为什么呢
因为您的@pin
从未初始化。您的代码与codecademy中的代码之间一定存在差异(它们可能在初始值设定项中初始化@pin
,而您没有)
但是当我删除pin检查中的@并将其视为正常变量时
错误。。这不是一个变量。当您将其设置为pin
而不是@pin
时,它开始指向您的私有方法。返回一个pin码。这就是它起作用的原因
请注意,如果您在存款前只需显示余额,您的代码将按原样工作。这被称为“呼叫顺序依赖关系”,这是不好的。
pin\u number==@pin
将返回false
,因为您从未设置@pin
,所以它仍然是nil
您可以这样做,而不是使用私有方法:
if pin_number==@pin
如果是初始化,您必须在私有pin上向下滚动一点method@ChristopherBovo:如果您调用该方法,当然可以。但是你不调用它(在你的例子中),我用codeacademy one给出的代码替换了代码,我调用了这个方法,但它仍然不起作用,你也不能调用这个方法,因为它是私有的,如果有人能找到错误,请告诉我it@ChristopherBovo当前位置Tom发布了工作代码,将其与您的代码进行比较,找出差异。另请参见我答案末尾的注释。它是初始化,您必须在私有pin methodNo处向下滚动一点。定义方法不会初始化变量。这正是您所犯的错误,我已经纠正了。如果您在初始值设定项中或以其他方式调用该方法,那么变量将被初始化。但是你没有在任何地方调用该方法。通过初始化pin,它可以工作,但没有从站点执行此类操作,因此他们的代码中存在错误,我提交了一份报告。谢谢不要那样修改代码。现在它是一段完全不同的代码,错误完全不同。我冒昧地回滚了您的代码更改,因为它们与文本不一致。不,错误保持不变,当我传递pin时,我得到pin错误,这就是我所说的。不,您得到的pin错误完全不同。(“无法调用私有方法
pin
)
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)