Почему я не могу вызвать метод методов объекта ClassHOW в Perl 6?

Я могу позвонить ^methods на объекте и перечислите имена методов, которые я могу вызвать:

my $object = 'Camelia';
my @object_methods = $object.^methods;
@object_methods.map( { .gist } ).sort.join("\n").say;

^methods возвращает список, в котором я храню @object_methods затем я преобразую этот список методов, вызывая gist на каждом, чтобы получить разумную для человека форму этого метода.

Но ^ в ^methods подразумевается .HOW, как показано в конце документации по объекту, это тоже должно работать:

my $object = 'Camelia';
my @object_methods = $object.HOW.methods;

Но я получаю ошибку:

Too few positionals passed; expected 2 arguments but got 1
  in any methods at gen/moar/m-Metamodel.nqp line 490
  in block <unit> at...    

И, как ни крути, это ужасное сообщение об ошибке для языка, который пытается быть дружелюбным к подобным вещам. Файл m-Metamodel.nqp не является частью моей установки perl6. Это даже не то, что я могу гуглить, потому что, как подсказывает путь, это то, что генерирует компиляция. И эта компиляция зависит от версии.

1 ответ

Решение

Обычный вызов метода через . передает инвокант как неявный первый аргумент методу. Вызов мета-метода через .^ передает два аргумента: мета-объект как инвокант и экземпляр как первый позиционный аргумент.

Например

$obj.^can('sqrt')

является синтаксическим сахаром для

$obj.HOW.can($obj, 'sqrt')

В вашем примере это будет читать

my @object_methods = $object.HOW.methods($object);
Другие вопросы по тегам