Почему я не могу вызвать метод методов объекта 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);