grondilu has asked for the wisdom of the Perl Monks concerning the following question:
Hi,
I recently wanted to overload '*' with one of my class which can accept external multiplication with bigints.
In other words, I wanted to do something like:
my $obj = new My::Custom::Object; use bigint; my $mult = 2**100 * $obj;
I realised that overloading '*' inside My::Custom::Object would not be enough as the class resolution would first process '*' inside Math::BigInt if the number is the first operand.
So I thought I should directly overload '*' inside Math::BigInt. I guess I can do that even if this class is not "mine", right?
package Math::BigInt; use overload '*' => sub { if (ref $_[1] eq 'My::Custom::Object') { $_[1]->MultiplyByInt($_[0]); } else { $_[0]->bmult($_[1]); } }
I'm not sure this is a good solution, though. My concern is about using 'bmult' instead of '*'. I doubt bmult will behave correctly if something else than a BigInt is provided as a second operand.
I thought about creating a child class of Math::BigInt so '*' can fallback to parent '*' when necessary but then I'll have to explicitely bless my integers which would be annoying.
So, how should I do this right?
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Overloading multiplication involving BigInt
by pileofrogs (Priest) on Jan 13, 2012 at 21:43 UTC | |
by grondilu (Friar) on Jan 14, 2012 at 15:17 UTC |