Класс также должен выполнять роль Iterable
:
class Config does Associative[Cool,Str] does Iterable {
...
}
Что требует реализации метода iterator
. В этом случае, вероятно, проще всего делегировать итератору вложенного хэша:
method iterator() { %!hash.iterator }
С этим ошибка устранена. (По умолчанию iterator
дает итератор, который представляет собой последовательность из 1 элемента, содержащую сам объект, таким образом, наблюдается ошибка.)
Итератор необходим, потому что семантика построения объекта с хеш-атрибутом присваивание , не привязка. Когда мы присваиваем хэш, мы получаем Iterator
из того, что мы присваиваем, и повторяем его, чтобы получить значения для присваивания. Я упоминаю об этом, если ваше ожидание было обязательным, то есть MyTest
будет ссылаться на экземпляр Config
. Для этого нужно написать пользовательский BUILD
, который выполняет связывание в MyTest
, или вместо этого объявить его как has $.config
, что означает, что он будет просто ссылаться на экземпляр Config
, а не копировать значения из него в новый хеш.