2016-03-05 80 views
4

我可以調用的對象上^methods並列出方法名我可以調用:爲什麼我不能在Perl 6的ClassHOW對象上調用methods方法?

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

^methods返回其餘存儲在@object_methods列表,然後後來我通過對每一個呼叫gist變換方法thingys的該列表以獲得該方法的人類合理形式。

但是,在^methods^是在object documentation結束隱含.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安裝的一部分。這甚至不是我可以谷歌的東西,因爲,正如路徑所示,這是編譯生成的東西。而且,該編譯取決於版本。

回答

5

通過.的常規方法調用將該調用者作爲隱式第一個參數傳遞給該方法。通過.^的元方法調用傳遞兩個參數:元對象爲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對象(我預計它已經知道是誰製作的)。 –

相關問題