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

时间:2016-05-24 20:45:46

标签: perl6

可以通过函数语法调用

sqrt

> sqrt 16
4

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

> 16.sqrt
4

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

例如,让我们定义sq

> sub sq(Int $n) { $n*$n }
sub sq (Int $n) { #`(Sub|64042864) ... }
> sq 4
16

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

> 4.sq

2 个答案:

答案 0 :(得分:9)

  

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

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

625.&sqrt.say
# 25

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

sub sq { $^a² }; say 4.&sq
4.&sq.say
# 16

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

4.&sq\
 .&sq.say;

答案 1 :(得分:4)

您可以使用猴子类型来增强Int。期待优化者保释,你的威利/胸部缩小,整个世界结束。打字是邪恶的。除非必须,否则不要使用它。

use MONKEY-TYPING; 
augment class Int { method sq(Int:D $i:){ $i * $i } };
my Int $i = 4;
say $i.sq;

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

my $i = 4 but role :: { method sq(Int:D $i:){ $i * $i } };
say $i.sq;

您可以创建一个自由浮动方法并使用.&方法调用操作符。

my method sq(Int:D $i:){ $i * $i };
my $i = 4;
say $i.&sq;

编辑:

如果你真的想打破假设,你甚至可以访问私有属性。

class Foo { has $!bar = 'meow'; };
use MONKEY-TYPING;
augment class Foo { method baz { say $!bar } };
Foo.new.baz
# OUTPUT«meow␤»