2016-03-05 7 views
4

я могу назвать ^methods на объекте и список имен методов можно назвать:Почему я не могу вызвать метод методов на объекте ClassHOW Perl 6?

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

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

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

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. Это даже не то, что я могу сделать Google, потому что, как указывает путь, это то, что генерирует компиляция. И эта компиляция зависит от версии.

ответ

5

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

Например

$obj.^can('sqrt') 

является синтаксически

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

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

my @object_methods = $object.HOW.methods($object); 
+0

Где это документально? –

+3

В том же документе, к которому вы привязались, к языку/объектам, говорится: «Вызывающее соглашение для методов на метаобъектах - это вызов метода на метаобъекте и передача в объект, представляющий интерес, в качестве первого аргумента для объекта. », а также говорит, что« скажем 1.^имя »; «тот же, что и», скажем 1.HOW.name (1); » – timotimo

+0

Вот пример, который я вижу более четко, но отсутствует [документация для метода] (http://doc.perl6.org/routine/methods#role_Metamodel::MethodContainer). Он отмечает, что он проверяет класс, и он показывает аргумент $ obj, но я ожидал, что это объект ClassHOW (который, как я ожидал, уже знал, кто его создал). –

 Смежные вопросы

  • Нет связанных вопросов^_^