Thread eq Operator überlagern (24 answers)
Opened by rosti at 2024-08-22 14:48

haj
 2024-08-26 23:48
#196670 #196670
User since
2015-01-07
555 Artikel
BenutzerIn

user image
Das Perldoc:overload-Pragma ist dazu da, Objekte wie primitive Datentypen behandeln zu können. Objekte sind in Perl Referenzen: Referenzen können beispielsweise nicht sinnvoll addiert und subtrahiert werden, aber mit overload kann man Addition und Subtraktion so definieren, dass zwei Objekte addiert werden können. Bei Vektoren und Matrizen ist das ziemlich weit verbreitet, es macht das Hinschreiben der Gleichungen viel kompakter. CPAN:PDL ist ein Beispiel dafür, was man mit Objekten machen kann, deren Daten "nur" in XS-Code existieren.

Dein Code wendet das Pragma im Namespace main an, das ist schon ziemlich schräg. Aber selbst das geht, weil man Objekte auch in den Namespace main taufen kann. Also machen wir das mal mit dem Code.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use 5.026;
use Test::More tests => 3;

use overload "==" => \&my_compare;
sub my_compare {
    my ($left, $right) = @_;
    if (ref $left  eq  ref $right) {
        return $$left  eq  $$right;
    }
    elsif (! ref $right) {
        return $$left eq $right;
    }
}

sub comparable {
    my $name = shift;
    bless \$name;
}

my $name = comparable "Erwin";
my $hugo = comparable "Hugo";

ok($name == "Erwin",     "Name ist Erwin");
 
ok("Erwin" == $name,     "Name ist Erwin, auch andersrum");

ok(not ($name == $hugo), "Name ist nicht Hugo");

Hier sieht man, dass die Objekte sowohl mit anderen Objekten der gleichen Klasse als auch mit einfachen Strings verglichen werden können. Mit overload kann man aber nicht ändern, was Perl mit Basis-Datentypen (Zahlen und Zeichenketten) macht. Und es wird etwas verwirrender, wenn man Objekte verschiedener Klassen miteinander verarbeiten will.

View full thread eq Operator überlagern