почему я должен ссылаться на метод вместо @variable? - PullRequest
1 голос
/ 01 июня 2019

Изучение классов, методов, глобальных переменных экземпляра и переменных класса.

Создание базового класса учетной записи, а метод вывода принимает 2 переменные: pin_number, amount. Я не понимаю, почему оба они не возвращают истину.

в методе вывода, если я пойду:

 if pin_number == pin 

вызывает метод pin, возвращает @pin и утверждение истинно

 if pin_number == @pin 

оператор возвращает false

Моим первым предположением был закрытый тег, но я удалил его и до сих пор не вернул true.

class Account
  attr_reader :name, :balance
  def initialize(name, balance=100)
    @name = name
    @balance = balance
  end

  public
    def withdraw(pin_number, amount)
      if pin_number == pin
        @balance -= amount
        puts "Withdrew #{amount}. New balance: $#{@balance}."
      else
        puts pin_error
      end
    end

    def display_balance(pin_number)
      if pin_number == pin
        puts "Balance: $#{@balance}."
      else
        puts pin_error 
      end
    end

    def deposit(amt)
      @balance += amt
      puts @balance
    end
private
    def pin
    @pin = '1234'
  end

 def pin_error
    "Access denied: incorrect PIN."
  end
end

checking_account = Account.new('Jensen', 904)
checking_account.deposit(5)
checking_account.withdraw('1234',900)

1 Ответ

3 голосов
/ 01 июня 2019

Эффект, который вы видите, заключается в том, что вы присваиваете только переменную экземпляра @pin внутри метода pin.

То есть, пока вы не назвали pin в вашем сравнении, это было установлено. Когда вы пытались использовать @pin напрямую, он еще не был инициализирован.

Назначьте переменную @pin в initialize, и тогда все будет работать.

class Account
  attr_reader :name, :balance
  def initialize(name, balance=100)
    @name = name
    @balance = balance
    @pin = '1234'
  end

  public
    def withdraw(pin_number, amount)
      if pin_number == @pin
        @balance -= amount
        puts "Withdrew #{amount} from pin #{@pin}, new bal is #@balance"
      else
        puts pin_error
      end
    end

    def display_balance(pin_number)
      if pin_number == @pin
        puts "Balance: $#{@balance}."
      else
        puts pin_error 
      end
    end

    def deposit(amt)
      @balance += amt
      puts "Deposited #{amt} to pin #@pin, new bal is #@balance"
    end

 def pin_error
    "Access denied: incorrect PIN."
  end
end

checking_account = Account.new('Jensen', 904)
checking_account.deposit(5)
checking_account.withdraw('1234',900)

Это производит

Deposited 5 to pin 1234, new bal is 909
Withdrew 900 from pin 1234, new bal is 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...