Курс по Raku / Приложение 🆕 / Типове и текстови машини / Обекти и класове / Exercises / Банкова сметка
Решение: Банкова сметка
Ето едно възможно решение на задачата.
Код
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.