定义可以通过方法语法调用的子例程

dha*_*ech 8 perl6

sqrt 可以通过函数语法调用:

> sqrt 16
4
Run Code Online (Sandbox Code Playgroud)

它也可以通过方法语法调用:

> 16.sqrt
4
Run Code Online (Sandbox Code Playgroud)

有没有办法通过方法语法使用户定义的子程序可以调用?

例如,让我们定义sq:

> sub sq(Int $n) { $n*$n }
sub sq (Int $n) { #`(Sub|64042864) ... }
> sq 4
16
Run Code Online (Sandbox Code Playgroud)

有没有办法让它可以作为方法调用?即

> 4.sq
Run Code Online (Sandbox Code Playgroud)

小智 9

有没有办法通过方法语法使用户定义的子程序可以调用?

是的,只需使用.&语法,如:

625.&sqrt.say
# 25
Run Code Online (Sandbox Code Playgroud)

调用者作为第一个参数传递:

sub sq { $^a² }; say 4.&sq
4.&sq.say
# 16
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,如果要将方法链分解为多行,则必须使用unspace:

4.&sq\
 .&sq.say;
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用猴子打字来增强Int. 预计优化者会放弃,你的阴茎/胸部会缩小,世界将会终结。猴子打字是邪恶的。除非必要,否则不要使用它。

\n\n
use MONKEY-TYPING; \naugment class Int { method sq(Int:D $i:){ $i * $i } };\nmy Int $i = 4;\nsay $i.sq;\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以将角色混合到对象中。注意,对象就是对象,不是类,Int也不是容器$i

\n\n
my $i = 4 but role :: { method sq(Int:D $i:){ $i * $i } };\nsay $i.sq;\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以创建自由浮动方法并使用.&方法调用运算符。

\n\n
my method sq(Int:D $i:){ $i * $i };\nmy $i = 4;\nsay $i.&sq;\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:

\n\n

如果您确实想打破假设,您甚至可以访问私有属性。

\n\n
class Foo { has $!bar = 'meow'; };\nuse MONKEY-TYPING;\naugment class Foo { method baz { say $!bar } };\nFoo.new.baz\n# OUTPUT\xc2\xabmeow\xe2\x90\xa4\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n