Курс Raku / Додаток 🆕 / Типи та текстові машини / Об’єкти та класи / Вправи / Банківський рахунок
Розв’язання: Банківський рахунок
Ось одне з можливих розв’язань задачі.
Код
class Account {
has $!balance = 0;
method deposit($amount) {
$!balance += $amount;
}
method withdraw($amount) {
if $amount > $!balance {
say 'declined: insufficient funds';
}
else {
$!balance -= $amount;
}
}
method balance { $!balance }
}
my $account = Account.new;
$account.deposit(100);
$account.withdraw(30);
$account.withdraw(200);
say $account.balance;🦋 Знайдіть програму у файлі bank-account.raku.
Вивід
declined: insufficient funds
70Коментарі
has $!balance = 0оголошує атрибут приватним — із тайглом!він узагалі не має згенерованого аксесора, тож єдиний спосіб змінити баланс — це методи, які надає клас.method balanceдає зовнішньому світові спосіб його прочитати, але не спосіб його встановити.Це зроблено навмисно. Якби ми написали
has $.balance, тайгл.додав би публічний аксесор — типово лише для читання, але одне необачнеis rwна ньому відкрило б пряме присвоєння на кшталт$account.balance = 1_000_000, дозволивши будь-кому рухати гроші повзdepositчиwithdraw. Приватний атрибут виключає це за побудовою: баланс може змінюватися лише за власними правилами рахунку — такими, як перевірка на нестачу коштів уwithdraw.Друге знімання просить більше, ніж є на балансі, тож його відхилено, а баланс лишається на
70.