构造函数指向perl6中的类
我想用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
使用函数指针来选择我使用的构造函数?
回答:
我认为这是一个LTA错误的情况。我所理解的你想实现的是一个lambda,它会为你创建一个新的对象human1
或human2
。你这样做的方式是不正确的,它造成的错误令人困惑。
my $hum1_const = -> { human1.new }; my $hum2_const = -> { human2.new };
将是这样做的正确方法。虽然,我会认为这有点混淆。由于human1
和human2
已经常数,你可以将它们分配给一个变量,然后只需拨打该new
:
my $the_human = $condition ?? human1 !! human2; my $c = $the_human.new;
$c.fn1;
这是否有意义?
回答:
要获得对.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;
以上是 构造函数指向perl6中的类 的全部内容, 来源链接: utcz.com/qa/265814.html