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

问题描述 投票:-1回答:2
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 

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

ruby
2个回答
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)

0
投票

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

因为你的@pin从未被初始化。你的代码和它们在codecademy上的东西之间必须有所不同(它们可能在初始化程序中初始化@pin,而你没有)。

但是当我在引脚检查中删除@并将其视为正常变量时

错了..这不是一个变数。当你制作pin而不是@pin时,它开始指向你的私有方法。返回一个密码。这就是它的原因。


请注意,如果您在存款之前只是display_balance,那么您的代码将按原样运行。这称为“呼叫顺序依赖”,这很糟糕。

© www.soinside.com 2019 - 2024. All rights reserved.