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

混合输入角色声明中提供的混合输入对象变量

  •  6
  • jjmerelo  · 技术社区  · 8 年前

    我想知道如何在运行时将抽象角色混合到变量中。这是我想到的

    role jsonable {
        method to-json( ) { ... }
    }
    
    class Bare-Word {
        has $.word;
        method new ( Str $word ) {
            return self.bless( $word );
        }
    }
    
    my $that-word = Bare-Word.new( "Hola" ) but role jsonable { method to-json() { return "['$!word']"; } };
    

    但是,这会引发一个(完全合理的)错误:

    $ perl6 role-fails.p6
    ===SORRY!=== Error while compiling /home/jmerelo/Code/perl6/dev.to-code/perl6/role-fails.p6
    Attribute $!word not declared in role jsonable
    at /home/jmerelo/Code/perl6/dev.to-code/perl6/role-fails.p6:14
    ------> hod to-json() { return "['$!word']"; } }⏏;
        expecting any of:
            horizontal whitespace
            postfix
            statement end
            statement modifier
            statement modifier loop
    

    $!word 属于该类,因此不可用 像这样的 在mixin声明中。然而 but is simply a function call 所以声明的变量应该在内部可用,对吗?访问它的正确语法是什么?

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

    正确的语法应该是 $.word ,基本上是 self.word ,因此它使用公共访问方法。

    但我认为这里有一些拼写错误和误解。(我认为)错别字是 .bless 只接受命名参数,因此 $word ,应该是 :$word (将位置旋转到 word => $word ). 此外,定义但不实现方法的角色,然后使用相同的名称实现具有该名称的角色,也没有意义。我很惊讶它没有产生错误。所以现在就把它扔掉。这是我的“解决方案”:

    class Bare-Word {
        has $.word;
        method new ( Str $word ) {
            return self.bless( :$word );  # note, .bless only takes nameds
        }
    }
    
    my $that-word = Bare-Word.new( "Hola" ) but role jsonable {
        method to-json() {
            return "['$.word']"; # note, $.word instead of $!word
        }
    }
    
    dd $that-word; # Bare-Word+{jsonable}.new(word => "Hola")
    

    希望这有帮助。

    推荐文章