Курс языка программирования 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объявляет атрибут приватным: с тайглом!у него вообще нет сгенерированного аксессора, поэтому изменить баланс можно только через методы, которые предоставляет класс. Методbalanceдаёт внешнему миру возможность прочитать значение, но не установить его.Так сделано намеренно. Напиши мы
has $.balance, тайгл.добавил бы публичный аксессор — по умолчанию только для чтения, но одно неосторожноеis rwна нём открыло бы прямое присваивание вроде$account.balance = 1_000_000, позволяя кому угодно двигать деньги в обходdepositиwithdraw. Приватный атрибут исключает это по построению: баланс может меняться только по собственным правилам счёта, таким как проверка на нехватку средств вwithdraw.Второе снятие просит больше, чем есть на балансе, поэтому оно отклоняется, и баланс остаётся равным
70.