代码之家  ›  专栏  ›  技术社区  ›  BhaskarS

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

  •  7
  • BhaskarS  · 技术社区  · 8 年前

    我试图用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();
    

    基本上,我希望能够使用 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 使用函数指针选择我使用的构造函数?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Elizabeth Mattijsen    6 年前

    获取对 .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;
    
        2
  •  4
  •   Elizabeth Mattijsen    8 年前

    我认为这是一个LTA错误的案例。据我所知,您想要实现的是一个lambda,它将创建一个新的 human1 human2 对象。您这样做的方式是不正确的,它所导致的错误是令人困惑的。

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

    这样做是正确的。尽管如此,我认为这有点令人困惑。自从 人力资源1 人力资源2 已经是常量,您可以将它们分配给变量,然后只需调用 new 在此基础上:

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

    这有意义吗?

    推荐文章