Curso de Raku / Apéndice 🆕 / Tipos y máquinas de texto / Objetos y clases / Exercises / Una cuenta bancaria
Solución: Una cuenta bancaria
Aquí tienes una posible solución para la tarea.
Código
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;🦋 Puedes encontrar el código fuente en el archivo bank-account.raku.
Salida
declined: insufficient funds
70Comentarios
has $!balance = 0declara el atributo como privado: con el tigilo!no tiene ningún accesor generado, así que la única manera de cambiar el saldo es a través de los métodos que la clase proporciona. Unmethod balancele da al mundo exterior una forma de leerlo, pero ninguna de asignarlo.Esto es deliberado. Si hubiéramos escrito
has $.balance, el tigilo.añadiría un accesor público —de solo lectura por omisión, pero un descuidadois rwsobre él expondría la asignación directa, como$account.balance = 1_000_000, permitiendo a cualquiera mover dinero sin pasar pordepositniwithdraw. Mantener el atributo privado lo descarta por construcción: el saldo solo puede cambiar según las reglas de la propia cuenta, como la comprobación de fondos insuficientes dewithdraw.La segunda retirada pide más de lo que hay en el saldo, así que se rechaza y el saldo se queda en
70.