Quickly: Using a sub as a method
Quickly now, let’s consider the difference between a sub
and a method
. When
programming Perl 6, the only significant difference between a sub
and a
method
is that a method
always takes at least one positional argument
whereas a sub
only takes what’s listed in the parameter list. In a method, the
required first positional parameter is not passed as part of the parameter list,
but assigned to self
.
For example,
class Demo {
has $.value;
sub foo(Demo $val) is export { put $val }
method bar() { put self }
method Str() { ~$.value }
}
import Demo;
my $demo = Demo.new(value => 42);
foo($demo); # OUTPUT: «42»
$demo.bar(); # OUTPUT: «42»
Ready for the trick? The subroutine can be called as a method too, like this:
$demo.&foo; # OUTPUT: «42»
That’s it. Any subroutine can be used as a method by using the .&
operator to
make the call. The object before the operation will be passed as the first
argument.
My favorite usage of this feature is this one:
use JSON::Fast;
my %data = "config.json".IO.slurp.&from-json;
There’s more, but I’m just posting this quickly.
Cheers.