指向perl6中的类的构造函数的指针

Bha*_*arS 6 class perl6 raku

我正在尝试用Perl 6编写一些类来测试Perl 6类和方法.

这是代码:

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();
Run Code Online (Sandbox Code Playgroud)

基本上我希望能够使用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
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*ert 5

要获得“参考”,.new您必须使用元对象协议。
要么.^lookup,或.^find_method

my $hum1-create = human1.^find_method('new');
Run Code Online (Sandbox Code Playgroud)

这仍然不是您想要的,因为方法需要一个类对象或一个实例作为它们的第一个参数。

my $c = $hum1-create( human1 );
Run Code Online (Sandbox Code Playgroud)

因此,您可能希望将类作为方法的第一个参数。

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

my $c = $hum1-create();
Run Code Online (Sandbox Code Playgroud)

请注意,.assuming在这种情况下,基本上与

-> |capture { human1.^find_method('new').( human1, |capture ) }
Run Code Online (Sandbox Code Playgroud)

所以你可以这样写:

my $hum1-create = -> |capture { human1.new( |capture ) }
Run Code Online (Sandbox Code Playgroud)

或者,如果您永远不会给它一个参数

my $hum1-create = -> { human1.new }
Run Code Online (Sandbox Code Playgroud)

另外,您可以将其存储在一个&sigiled变量中,因此可以像正常子例程一样使用它。

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

my $c = hum1-create;
Run Code Online (Sandbox Code Playgroud)


Eli*_*sen 4

我认为这是一个 LTA 错误的情况。我理解你想要实现的是一个 lambda ,它将为你创建一个新的human1human2对象。您这样做的方式不正确,并且它导致的错误令人困惑。

my $hum1_const = -> { human1.new };
my $hum2_const = -> { human2.new };
Run Code Online (Sandbox Code Playgroud)

将是这样做的正确方法。不过,我认为这有点令人困惑。由于human1human2已经是常量,您可以将它们分配给一个变量,然后调用new它:

my $the_human = $condition ?? human1 !! human2;
my $c = $the_human.new;
$c.fn1;
Run Code Online (Sandbox Code Playgroud)

那有意义吗?