TIL - Object Method: Named Arguments Unpacking
TIL (or re-learned) how to unpack an object method that has named args, thanks to the Modern Perl book:
my ($self, %args) = @_;
This idiom unpacks $self, then throw the rest of the arguments into %args.
Perl/CPAN user since 1992.
I always preferred
my $self = shift;
my %args = @_;
to keep the parameters in @_
or the more paranoid (coping with named parameters in a hashref)
my $self = shift;
my %args = @_ == 1 ? %{$_[0]} : @_;
or the one that loses you points in code review
my $self = shift;
local %_ = @_;
For a couple of years now I’ve been writing the opening line of my methods as
Of course an
%argsslots right in there.The point to this two-fold.
First of all, using
shiftto pull the instance into$self(or$classin a class method) makes it easy to say things like$self->SUPER::foo( @_ )where you pass along the whole “actual”@_to some other method that’s supposed to have the same signature.Secondly, Perl’s lack of real signatures already makes short subs/methods too painfully verbose, so the last thing we need is to make the problem even worse, and yet it’s good to have an obvious marker distinguishing methods from regular subroutines. This idiom accomplishes that without expending additional vertical space to do so.
I always preferred
my $self = shift;
my %args = @_;
because I usually do
my $self = shift;
my %args = (
param1 => "0", ## default value
param2 => undef, ## documenting
@_);
so that I can set reasonable defaults and don't have to do
if existsall over the place.