2015-10-12 19 views
6

Chcę zastąpić new, tak aby moja klasa mogła zostać utworzona tylko przekazując jeden argument do konstruktora, nie więcej i nie mniej.Konstruktor z tylko 1 argumentem w Perl 6

class MyClass { 
    has $.var1; 

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

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

Błąd jest:

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 

Co się z nim?

Odpowiedz

10

niestandardowe konstruktorów trzeba zadzwonić bless, tj

class MyClass { 
    has $.var1; 

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

Istnieje kilka rzeczy, które można poprawić, np

  • można było dodać wyraźnie parametr invocant i używać :U aby .new() zawieść po wywołaniu na obiektach instancji
  • jawne return jest zbędne - ostatnie wyrażenie w metodzie zostanie mimo to zwrócone, i Aktualnie jest to rzeczywiście boli wydajność
  • tam cukier syntaktyczny dla przechodzącej nazwanego argumentu przechowywanych w zmiennej o tej samej nazwie

wprowadzenie go wszyscy razem, możemy skończyć z

class MyClass { 
    has $.var1; 

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

na to, gdzie Twój błąd pochodzi z:

Twoja metoda new jest zadeklarowana jako przyjmująca argument pozycyjny (podając całkowitą liczbę 2 oczekiwanych argumentów z powodu niejawnego invocanta), ale wywołanie MyClass.new(var1 => $var1) na ly minął nazwany. Zauważ, że ta metoda jest jedyną wersją z twojej klasy, więc jeśli połączenie zadziałało, skończyłoby Ci się nieskończoną rekurencją!