Упс, есть много ошибок, которые были связаны с этим. Я не могу объяснить все проблемы, но давайте посмотрим, как далеко я могу получить:
Прежде всего вы переопределил #+
и #-
методы, чтобы дать им семантику вы ожидаете от #+=
и #-=
. Учитывая это: если вы используете acc-5
в своем примере (вместо acc-=5
), поведение близко к ожидаемому, irb
отобразит 15
, так как это результат вашего метода #-
(который имеет побочный эффект вычитания 5 баланса, а также).
Однако, как вы называете #-=
в вашем примере интерпретатор рубина заканчивает назначая методы приводят Fixnum
15
к вашим acc
-переменным. Это даст вам сообщение об ошибке NoMethodError: undefined method 'balance' for 15:Fixnum
при попытке получить доступ к #balance
, который определен для вашего класса Account
.
Ваш метод #-
должен возвращать Account
-объект, не изменять существующее состояние объекта и возвращать результат как Fixnum
. См. http://ruby.about.com/od/oo/ss/Overloading-Operators.htm для примеров переопределения операторов. Я понимаю, что это как-то поражает вашу цель, как вам хотелось бы использовать #-=
, чтобы изменить объект на месте, но он работает только при создании другого Account
-instance в Ruby, поскольку вы не можете переопределить #-=
напрямую (см. Ссылку выше) ,
Конечно, вы можете задать #withdraw
-метод, чтобы получить семантику, которую вы желаете.
Какую цель здесь обслуживает 'attr_accessor'? Почему бы просто не использовать '@ balance'? – Max