2017-12-27 403 views
4

我想用Perl 6编写一些类来测试Perl 6类和方法。构造函数指向perl6中的类

下面是代码:

class human1 { 
    method fn1() { 
     print "#from human1.fn1\n"; 
    } 
} 

class human2 { 
    method fn1() { 
      print "#from human2.fn1\n"; 
    } 
} 

my $a = human1.new(); 
my $b = human2.new(); 

$a.fn1(); 
$b.fn1(); 

print "now trying more complex stuff\n"; 

my $hum1_const = &human1.new; 
my $hum2_const = &human2.new; 

my $c = $hum2_const(); 
$c.fn1(); 

基本上我希望能够为使用的human1构造函数或human2构造,能够动态地建立$c对象。但我发现了以下错误:

Error while compiling /usr/bhaskars/code/perl/./a.pl6 
Illegally post-declared types: 
    human1 used at line 23 
    human2 used at line 24 

如何创建$c使用函数指针来选择我使用的构造函数?

+0

尝试在声明'$ hum2_const'时删除&符:'my $ hum2_const = human2。new;'在'$ hum2_const'前加一个&符号,并在定义'$ c'时删除括号:'my $ c =&$ hum2_const;' –

回答

3

我认为这是一个LTA错误的情况。我所理解的你想实现的是一个lambda,它会为你创建一个新的对象human1human2。你这样做的方式是不正确的,它造成的错误令人困惑。

my $hum1_const = -> { human1.new }; 
my $hum2_const = -> { human2.new }; 

将是这样做的正确方法。虽然,我会认为这有点混淆。由于human1human2已经常数,你可以将它们分配给一个变量,然后只需拨打该new

my $the_human = $condition ?? human1 !! human2; 
my $c = $the_human.new; 
$c.fn1; 

这是否有意义?

+0

yes。这工作。非常感谢! – BhaskarS

3

要获得对.new的“引用”,您必须使用元对象协议。
.^lookup.^find_method

my $hum1-create = human1.^find_method('new'); 

这仍然不是你看上去很什么,因为方法需要一个类的对象或实例,作为他们的第一个参数。

my $c = $hum1-create(human1); 

所以你可能想要咖啡类作为该方法的第一个参数。

my $hum1-create = human1.^find_method('new').assuming(human1); 

my $c = $hum1-create(); 

注意.assuming在这种情况下,基本上做同样的事情作为

-> |capture { human1.^find_method('new').(human1, |capture) } 

所以,你可以这样写:

my $hum1-create = -> |capture { human1.new(|capture) } 

或者,如果你是永远不会放弃它是一个参数

my $hum1-create = -> { human1.new } 

您也可以将其存储在& sigiled变量,所以你可以使用它,就好像它是一个正常的子程序。

my &hum1-create = human1.^find_method('new').assuming(human1); 

my $c = hum1-create;