Я не думаю, что Code
использует new
для строительства объекта. Это очень базовый уровень класса. Согласно исходному коду , на самом деле нужен Callable
, и это простая роль для применения любого класса. Лично я бы ожидал, что он позвонит CALL-ME
Для вашего второго примера мы можем найти
multi sub postcircumfix:<[ ]>( \SELF, Any:D \pos ) is raw {
SELF.AT-POS(pos.Int);
}
Так что, если тип не предусмотрен заранее, он просто попытается привести к Int
, которого нет у вашего класса.
Ваш первый ДОЛЖЕН работать, просто изменив его на
class Foo does Callable {
method POSITIONS(\foo) { 1 }
};
my Foo $foo .= new;
say <a b c>[$foo]
Однако это ошибки, жалующиеся на то, что Foo
не реализует .pos
. Эта функция не документирована в источнике, который я вижу , но ее реализация заставляет вещи работать волшебным образом:
class Foo does Callable {
method POSITIONS(|c) { (0,1,2,(0,1),(0,2),(1,2),(0,1,2),(0..2)).pick }
method pos(|c) { self.POSITIONS: c }
};
my Foo $foo .= new;
say <a b c>[$foo]
Позиционный аргумент, который передается в pos
, является списком, который нарезается ((a b c)
в вашем примере), на случай, если вы хотите настроить срез на основе содержимого массива, стиль grep
/ map
.
Edit:
На самом деле, глупо меня. pos
был переименован в POSITIONS
, а TIO (на котором я тестировал) не обновлялся. Из-за этого изменения я бы рекомендовал использовать pos
и POSITIONS
, просто вызывая POSITIONS
внутри pos
для всех, кто работает в старых реализациях.