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
答案 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»