就像你想的那樣, 在類的定義中可以聲明和定義方法。你期望不高的甚至文檔中都很少提及是用 my 關(guān)鍵字聲明的免費(fèi)浮點(diǎn)方法。現(xiàn)在為什么你想要:
my method foo(SomeClass:D:) { self }
明顯的答案是元對(duì)象協(xié)議中的 add_method 方法, 在 Rakudo 里你能找到它:
src/core/Bool.pm
32: Bool.^add_method('pred', my method pred() { Bool::False });
33: Bool.^add_method('succ', my method succ() { Bool::True });
35: Bool.^add_method('enums', my method enums() { self.^enum_values });
這種方法還有另外一種更詭異的用法。你可能很想知道在鏈?zhǔn)椒椒ㄕ{(diào)用中究竟發(fā)生了什么。我們可以扯開(kāi)最上面的那個(gè)表達(dá)式并插入一個(gè)短的變量, 輸出我們的調(diào)試, 并且繼續(xù)鏈?zhǔn)秸{(diào)用。好的名字很重要并且把它們浪費(fèi)在一個(gè)短變量上沒(méi)有必要。
<a b c>.&(my method ::(List:D) { dd self; self } ).say;
# output
# ("a", "b", "c")
# (a b c)
沒(méi)有顯式調(diào)用我們就不能沒(méi)有名字, 因?yàn)?Perl 6 不允許我們這樣做, 所以我們使用了空的作用域 :: 以使解析器高興。使用一個(gè)合適的調(diào)用, 我們就不需要它了。還有, 那個(gè)匿名方法不是 List 中的一員。我們需要使用后綴 .& 來(lái)調(diào)用它。如果我們需要多次使用那個(gè)方法我們可以把它拉出來(lái)并給它一個(gè)名字。
my multi method debug(List:D:) { dd self; self };
<a b c>.&debug.say;
# output
("a", "b", "c")
(a b c)
或者, 如果我們想允許回調(diào)的話, 我們可以把它作為默認(rèn)參數(shù)賦值。
sub f(@l, :&debug = my method (List:D:){self}) { @l.&debug.say };
f <a b c>, debug => my method ::(List:D){dd self; self};
# output
#("a", "b", "c")
# (a b c)
在 Perl 6 中基本上所有的東西都是類, 包括方法。 如果它是類它可以是一個(gè)對(duì)象并且我們能在我們喜歡的任何地方溜進(jìn)去。