Постоянное значение переменной экземпляра - PullRequest
0 голосов
/ 02 апреля 2019

Я создал следующий класс

class BankAccount                                                       
  def accountNumber                                                   
    @accountNumber=5                                                
  end                                                                 
  def accountNumber=(value)                                           
    @accountNumber=value                                            
  end                                                                 
end    

и я использую это так:

account=BankAccount.new
=> #<BankAccount:0x0000000295d6c8>
account.accountNumber
=> 5
account.accountNumber="223"
=> 223
account.accountNumber
=> 5

почему accountNumber равно 5 даже после установки на 223?

Ответы [ 2 ]

4 голосов
/ 02 апреля 2019

Когда вы вызываете account.accountNumber, он вызывает accountNumber метод , который вы определили как:

def accountNumber                                                   
  @accountNumber=5                                                
end                                                                 

Есть несколько способов это исправить, простойэто:

class BankAccount
  attr_accessor :account_number

  def initialize(account_number=5)
    @account_number = account_number
  end
end

Что прекрасно работает:

irb(main):009:0> x = BankAccount.new
=> #<BankAccount:0x00007fae449c5fc8 @account_number=5>
irb(main):010:0> x.account_number = 10
=> 10
irb(main):011:0> y = BankAccount.new
=> #<BankAccount:0x00007fae4495fed0 @account_number=5>
irb(main):012:0> y.account_number
=> 5
irb(main):013:0> z = BankAccount.new
=> #<BankAccount:0x00007fae480066a0 @account_number=5>
irb(main):015:0> z.account_number = 15
=> 15
irb(main):016:0> z.account_number
=> 15

Здесь ТАК ответ, как работает attr_accessor.

2 голосов
/ 02 апреля 2019

Когда вы звоните account.accountNumber, вы каждый раз назначаете @accountNumber как 5 из-за вашего метода.

Чтобы избежать этого, вы можете сделать это так:

class BankAccount
  DEFAULT_NUMBER = 5
  DEFAULT_AMOUNT = 10

  attr_accessor :number, :amount

  def initialize
    set_default_values
  end

  def set_default_values
    @number = DEFAULT_NUMBER
    @amount = DEFAULT_AMOUNT
  end
end

И теперь вы можете назначать значения, как вам нравится

account = BankAccount.new # => #<BankAccount:0x000055d581adbd38 @number=5 @amount=10>

account.number = 500
account.number # => 500

account.amount = 20
account.amount # => 20

account.amount = BankAccount::DEFAULT_AMOUNT
account.amount # => 10

account.set_default_values
account # => #<BankAccount:0x000055d581adbd38 @number=5 @amount=10>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...