Thread Hash to Class-Attributes (21 answers)
Opened by Kuerbis at 2016-01-06 09:57

betterworld
 2016-01-06 12:52
#183409 #183409
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass {
has $.length is rw;
has $.height is rw;
has $.color is rw;

method my_method ( Array $list, %opt? ) {
if %opt.defined {
for %opt.pairs {
self."{.key}"() = .value;
# self."{.key}"() := .value; Nee...
}
}
}
}

my $n = MyClass.new();
$n.my_method( [ 1, 2, 3 ], { length => 10, height => 6, color => 'green' });
say $n.perl;


Wie auch in Perl 5, mit genügend Sonderzeichen ist alles möglich ;-)

Aber ich bezweifle etwas die Sinnhaftigkeit dieser Methode. Man kann ja auch die Attribute direkt über die Accessoren setzen, statt my_method aufzurufen. Außerdem benutzt du $list nicht.

Außerdem habe ich $opt in %opt umbenannt. Dann spart man sich auch die Typangabe Hash. (Genaugenommen impliziert das "%" nicht einen Hash, sondern irgend eine Rolle, deren Namen ich gerade nicht weiß, die dann besagt, dass das Ding Keys und Values haben kann, oder so.)

Schlecht an dieser Lösung finde ich allerdings, dass mit self."{.key}"() erstmal jede Methode aufgerufen werden kann, auch my_method selbst. Wenn man es schön macht, müsste man vorher prüfen, ob die Methode auch wirklich zu einem Attribut gehört. Am besten sollte man eine Whitelist haben für die Attributnamen, die man in dieser Methode erlauben möchte. Im Idealfall baust du dir einen Automatismus zusammen, sodass statt is rw dann da steht is rw is settable_by_mymethod, und dadurch dann das Attribut setzbar wird.
Last edited: 2016-01-12 10:10:13 +0100 (CET)

View full thread Hash to Class-Attributes