Smartmatching of Objects
To avoid relying on an object’s underlying representation, if the smartmatch’s
right operand is an object that doesn’t overload ~~, it raises the exception, “Smart matching a non–overloaded object breaks
encapsulation”. That’s because one has no business digging
around to see whether something is “in” an object. These are all illegal
on objects without a ~~
overload:
%hash ~~ $object
42 ~~ $object
"fred" ~~ $objectHowever, you can change the way an object is smartmatched by
overloading the ~~ operator. This is
allowed to extend the usual smartmatch semantics. For objects that do
have an ~~ overload, see Chapter 13.
Using an object as the left operand is allowed, although it’s not
very useful. Smartmatching rules take precedence over overloading, so
even if the object in the left operand has smartmatch overloading, this
will be ignored. A left operand that is a nonoverloaded object falls
back on a string or numeric comparison of whatever the ref operator returns. Meaning:
$object ~~ Xdoes not invoke the overload method with
X as an argument. Instead, the above table is
consulted as normal, and based on the type of
X, overloading may or may not be invoked. For
simple strings or numbers, it becomes equivalent to this:
$object ~~ $number "$object" == $number $object ~~ $string "$object" eq $string
For example, this reports that the handle smells IOish:
use IO::Handle;
my $fh = IO::Handle–>new();
if ($fh ~~ /\bIO\b/) {
say "handle smells IOish";
}That’s because it ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access