in reply to Re^2: Overloading '=' doesn't DWIM
in thread Overloading '=' doesn't DWIM
I'm not sure if it is relevant--you may be aware already--but I added a couple of printfs to your code:
SV * _copy( SV * arg_obj, SV * second, SV * third ) { Number * num_obj; SV * obj_ref, * obj; printf( "_copy:%p %p %p\n", arg_obj, second, third ); ... SV * _set_from_existing( SV * arg_obj ) { Number * num_obj; SV * obj_ref, * obj; printf( "_set::%p\n", arg_obj ); ...
And it appears that the overloading is not causing your _copy() function to be called:
Finished Build Compile Stage _set::0185E260 555 113 Destroying ...... destroyed Destroying ...... destroyed
Which (as best I can tell) explains the output completely:
$$num1 = Grief::new( 113 ); $num2 = $num1; # Assign using _copy( ) $num3 = _set_from_existing( $num1 ); # Assign using _set_from_existing +( ) _set_val( $num1, 555 ); print _get_val( $num2 ),"\n", _get_val( $num3 ), "\n"; __END__
$num2, in the absence of the overloading is simply an alias to $num1, whereas $num3 is explicitely as new object with the same value. When you set $num1 to 555, you are also setting $num2, as they are both references to the same object.
All of which is probably not news to you. The only real question as far as I can see is if overload can't or won't allow you to overload assignment, why doesn't use overload '=' => \&_copy; throw an error?
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Overloading '=' doesn't DWIM
by syphilis (Archbishop) on May 02, 2007 at 01:01 UTC |