混入角色声明中可用的混入对象变量
Mixed-in object variables available in mixed-in role declaration
我想知道如何在运行时将抽象角色混合到变量中。这是我想出的
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
属于 class,所以它在 mixin 声明中不可用 as such。但是,but is simply a function call 所以声明的变量应该在里面可用吧?访问它的正确语法是什么?
正确的语法是 $.word
,它基本上是 self.word
的缩写,所以它使用 public 访问方法。
但我认为这里有一些错别字和一些误解。打字错误(我认为)是 .bless
只接受命名参数,所以而不是 $word
,它应该是 :$word
(将位置转换为 word => $word
)。此外,定义但不实现方法的角色,然后使用相同的名称来实现具有该名称的角色,没有意义。我很惊讶它不会产生错误。所以暂时摆脱它。这是我的 "solution":
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")
希望对您有所帮助。
我想知道如何在运行时将抽象角色混合到变量中。这是我想出的
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
属于 class,所以它在 mixin 声明中不可用 as such。但是,but is simply a function call 所以声明的变量应该在里面可用吧?访问它的正确语法是什么?
正确的语法是 $.word
,它基本上是 self.word
的缩写,所以它使用 public 访问方法。
但我认为这里有一些错别字和一些误解。打字错误(我认为)是 .bless
只接受命名参数,所以而不是 $word
,它应该是 :$word
(将位置转换为 word => $word
)。此外,定义但不实现方法的角色,然后使用相同的名称来实现具有该名称的角色,没有意义。我很惊讶它不会产生错误。所以暂时摆脱它。这是我的 "solution":
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")
希望对您有所帮助。