В настоящее время я просматриваю «The Well Grounded Rubyist 2nd Edition». Я нахожусь на странице 196 и получил следующий код.
class Account
attr_accessor :balance
def initialize(amount=0)
self.balance = amount
end
def +(x)
self.balance += x
end
def -(x)
self.balance -= x
end
def to_s
balance.to_s
end
end
Я использовал это в сеансе irb, например
2.3.3 :001 > require './account.rb'
=> true
2.3.3 :002 > acc = Account.new(20)
=> #<Account:0x007fccb1834ef8 @balance=20>
2.3.3 :003 > balance
NameError: undefined local variable or method `balance' for main:Object
from (irb):3
from /Users/BartJudge/.rvm/rubies/ruby-2.3.3/bin/irb:11:in `<main>'
2.3.3 :004 > acc.balance
=> 20
2.3.3 :005 > acc+=5
=> 25
2.3.3 :006 > acc.balance
NoMethodError: undefined method `balance' for 25:Fixnum
from (irb):6
from /Users/BartJudge/.rvm/rubies/ruby-2.3.3/bin/irb:11:in `<main>'
2.3.3 :007 > acc -= 5
=> 20
2.3.3 :008 > acc.balance
NoMethodError: undefined method `balance' for 20:Fixnum
from (irb):8
from /Users/BartJudge/.rvm/rubies/ruby-2.3.3/bin/irb:11:in `<main>'
2.3.3 :009 >
Строка 4 работает так, как я ожидал acc.balance
Однако, когда я снова использую ее в строке 8, я получаю следующую ошибку undefined method `balance' for 20:Fixnum
Когда я делаю следующее, он работает последовательно, как я ожидаю.
=> true
2.3.3 :002 > acc = Account.new(20)
=> #<Account:0x007f82d1834f18 @balance=20>
2.3.3 :003 > acc.balance
=> 20
2.3.3 :004 > acc.balance
=> 20
2.3.3 :005 > acc.+ (5)
=> 25
2.3.3 :006 > acc.balance
=> 25
2.3.3 :007 > acc.-(10)
=> 15
2.3.3 :008 > acc.balance
=> 15
2.3.3 :009 >
Я предполагаю, что это как-то связано с тем, как вызываются методы, но я не могу найти ничего, чтобы объяснить это. Кто-нибудь может пролить свет на несоответствие результатов и почему FIXNUM участвует. Я думал, что @balance будет INTEGER.
ТИА.
acc + 5
это сокращение отacc.+(5)
- person steenslag   schedule 08.12.2019