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. 预计优化者会放弃,你的阴茎/胸部会缩小,世界将会终结。猴子打字是邪恶的。除非必要,否则不要使用它。
use MONKEY-TYPING; \naugment class Int { method sq(Int:D $i:){ $i * $i } };\nmy Int $i = 4;\nsay $i.sq;\nRun Code Online (Sandbox Code Playgroud)\n\n您可以将角色混合到对象中。注意,对象就是对象,不是类,Int也不是容器$i。
my $i = 4 but role :: { method sq(Int:D $i:){ $i * $i } };\nsay $i.sq;\nRun Code Online (Sandbox Code Playgroud)\n\n您可以创建自由浮动方法并使用.&方法调用运算符。
my method sq(Int:D $i:){ $i * $i };\nmy $i = 4;\nsay $i.&sq;\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:
\n\n如果您确实想打破假设,您甚至可以访问私有属性。
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n