2015-10-12 47 views
6

new'u geçersiz kılmak için sınıfımın kurgusuna yalnızca tek argümanını geçerek oluşturulabilir, daha az ve daha az değil.Perl 6'da yalnızca 1 argümanı olan bir kurucu 6

class MyClass { 
    has $.var1; 

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

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

hatadır:

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 

bunun nesi var?

cevap

10

Özel kurucular, bless çağırmanız gerekir yani

class MyClass { 
    has $.var1; 

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

geliştirilebilir bir kaç şey vardır mesela

  • biri açık bir invocant parametresini ekleyip .new() başarısız yapmak için :U kullanabilirsiniz Örnek nesneler
  • açık olduğunda, return açık 0 - 2, yöntemdeki son ifade yine de iade edilir ve Şu anda, aslında sözdizimsel şeker Hepsini bir araya getirirsek aynı adı

bir değişkene düzenlenen adlandırılmış argüman geçirmek için var

  • , nereye gelince

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

    ile bitirmek performans

  • acıyor hata gelir dan:

    Yöntemin new (nedeniyle örtülü invocant 2 beklenen argümanlar toplam sayısı vererek) bir konumsal argüman almaya ilan, ancak çağrı MyClass.new(var1 => $var1) üzerinde ly bir adlandırılmış birini geçti. Söz konusu yöntemin, sınıfınızda mevcut olan tek .new() olduğunu unutmayın, böylece arama gerçekten işe yaradıysa, sonsuz yineleme ile sona erecektiniz!

    İlgili konular