在Ruby中的实例变量中传递参数会产生错误

时间:2017-12-23 14:30:32

标签: ruby

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 

然而它不起作用,即使它应该,为什么呢?

2 个答案:

答案 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)