2015-10-12 5 views
6

Ich möchte new überschreiben, so dass meine Klasse erstellt werden kann, nur ein Argument zum Konstruktor übergeben, nicht mehr und nicht weniger.Ein Konstruktor mit nur 1 Argument in Perl 6

class MyClass { 
    has $.var1; 

    method new($var1) { 
    return MyClass.new(var1 => $var1); 
    } 
} 

my $my_class1 = MyClass.new(33); 
say $my_class1.var1; 

Der Fehler ist:

Too few positionals passed; expected 2 arguments but got 1 
    in method new at test1.pl6:28 
    in method new at test1.pl6:28 
    in block <unit> at test1.pl6:33 

Was mit ihm ist los?

Antwort

10

Benutzerdefinierte Konstrukteure müssen bless nennen, dh

class MyClass { 
    has $.var1; 

    method new($var1) { 
     return self.bless(var1 => $var1); 
    } 
} 

Es gibt ein paar Dinge, die verbessert werden können, zB

  • man könnte eine explizite Aufrufer Parameter hinzufügen und :U.new() zu machen verwenden scheitern beim Aufruf von Instanzen Objekte
  • die explizite return ist überflüssig - der letzte Ausdruck innerhalb der Methode wird trotzdem zurückgegeben, und zur Zeit, es tut weh tatsächlich Leistung
  • es für das Bestehen ein benanntes Argument in einer Variablen mit dem gleichen Namen gehalten syntaktischer Zucker ist

setzen sie alle zusammen, wir am Ende mit

class MyClass { 
    has $.var1; 

    method new(MyClass:U: $var1) { 
     self.bless(:$var1); 
    } 
} 

Was wo Ihr Fehler kommt von:

Ihre Methode new wird deklariert, um ein Positionsargument zu nehmen (mit einer Gesamtanzahl von 2 erwarteten Argumenten aufgrund des impliziten Aufrufs), aber der Aufruf MyClass.new(var1 => $var1) an Ich habe einen Namen gegeben. Beachten Sie, dass diese Methode die einzige ist, die in Ihrer Klasse vorhanden ist. Wenn also der Aufruf tatsächlich funktioniert hätte, hätten Sie eine unendliche Rekursion erhalten!

Verwandte Themen