in reply to Overloading oddity

I'm a bit confused because when overload is triggered, it appears to be passing 'undef':

#!/usr/local/bin/perl + package SomeClass; use Data::Dumper; + use overload '""' => \&name; sub new { return bless {}, shift; } + sub name { print Dumper \@_; my $self = shift; $self->{NAME} = shift if @_; return $self->{NAME}; } + package main; my $thing = SomeClass->new; $thing->name('TestObj'); print "Implicit: my name is $thing\n";

That gives the following output:

$VAR1 = [ bless( {}, 'SomeClass' ), 'TestObj' ]; $VAR1 = [ bless( { 'NAME' => 'TestObj' }, 'SomeClass' ), undef, '' ]; Implicit: my name is

We can clearly see 'undef' is being passed and that's what's throwing off your conditional. This is so counter-intuitive that I assume I'm missing something, though a quick scan through the docs doesn't reveal what that would be.

Cheers,
Ovid

New address of my CGI Course.

Replies are listed 'Best First'.
Re: Overloading oddity
by Abigail-II (Bishop) on Jan 27, 2004 at 23:13 UTC
    We can clearly see 'undef' is being passed and that's what's throwing off your conditional. This is so counter-intuitive that I assume I'm missing something, though a quick scan through the docs doesn't reveal what that would be.
    The relevant part of the documentation is:
    Calling Conventions for Binary Operations The functions specified in the "use overload ..." direc­ tive are called with three (in one particular case with four, see "Last Resort") arguments. If the corresponding operation is binary, then the first two arguments are the two arguments of the operation. However, due to general object calling conventions, the first argument should always be an object in the package, so in the situation of "7+$a", the order of the arguments is interchanged. It probably does not matter when implementing the addition method, but whether the arguments are reversed is vital to the subtraction method. The method can query this infor­ mation by examining the third argument, which can take three different values: FALSE the order of arguments is as in the current opera­ tion. TRUE the arguments are reversed. "undef" the current operation is an assignment variant (as in "$a+=7"), but the usual function is called instead. This additional information can be used to generate some optimizations. Compare "Calling Conventions for Mutators".
    The first argument is the object, no surprise here. Since the stringify operation is a unary operation, the second argument is undefined. The third argument is the empty string, which is false, but defined. And this fits the description of the documentation - the arguments aren't reversed, nor is the operation an assignment variant.

    Abigail

Re: Re: Overloading oddity
by theguvnor (Chaplain) on Jan 27, 2004 at 22:12 UTC
    Thanks for the idea to check what's being passed into name(). I confess I really have no idea why the undef is being passed in there either though.

    [Jon]