Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Классы и объекты / Атрибуты

Атрибуты для чтения и записи

По умолчанию аксессор, создаваемый объявлением has $.name, работает только на чтение. Значение инициализируется в конструкторе, после чего его можно читать, но нельзя изменить извне объекта. Присваивание приводит к ошибке:

class Dog {
    has $.name;
}

my $rex = Dog.new(name => 'Rex');
$rex.name = 'Max';

Программа останавливается с сообщением:

Cannot modify an immutable Str (Rex)

Чтобы разрешить изменять значение через аксессор, пометьте атрибут трейтом is rw:

class Dog {
    has $.name is rw;
}

my $rex = Dog.new(name => 'Rex');
$rex.name = 'Max';
say $rex.name; # Max

Теперь аксессор возвращает изменяемый контейнер, поэтому присваивание срабатывает и name объекта становится Max.

Навигация по курсу

Атрибуты   |   Значения по умолчанию


💪 Или перейдите сразу к упражнениям этого раздела.