不能在`qqww`或`qqww:to`结构中使用冒号对

che*_*nyf 4 raku

我想使用a生成一个json行Class,我会覆盖该gist方法,以便它将打印出我想要的内容:

my $ak = '7111ac873c9dcd5fc335ded47630d050';
my $st = '1523451601875';
my $ifo = 'true';
my $uu = "15778787898988090";

class Stay {
  has $.ak  is rw = '7111ac873c9dcd5fc335ded47630d050';
  has $.uu  is rw;
  has $.ifo is rw;
  has $.st  is rw;

  method gist() {
    #return qqww/{"ev":"app","ak":"$!ak","uu":"$!uu","ifo":"$!ifo","st":"$!st"}/;

    return qqww:to?EOF?;
    {"ev":"app","ak":"$!ak","uu":"$!uu","ifo":"$!ifo","st":"$!st"}
    EOF
  }
}

say Stay.new(uu => $uu, ifo => $ifo, st => $st); 
Run Code Online (Sandbox Code Playgroud)

但失败了:

===SORRY!=== Error while compiling /Users/ohmycloud/Desktop/stay.pl6
Confused
at /Users/ohmycloud/Desktop/stay.pl6:18
------>     {"ev":?"app","ak":"$!ak","uu":"$!uu","ifo":"$!i
    expecting any of:
        colon pair
Run Code Online (Sandbox Code Playgroud)

我想要的是:

{"ev":"app","ak":"7111ac873c9dcd5fc335ded47630d050","uu":"15778787898988090","ifo":"true","st":"1523451601875"}
Run Code Online (Sandbox Code Playgroud)

为什么我不能用冒号对qqwwqq:to结构?

wam*_*mba 6

{}在双引号中有特殊意义.他们必须逃脱

qq:to?EOF?;
\{"ev":"app","ak":"$!ak","uu":"$!uu","ifo":"$!ifo","st":"$!st"\}
EOF
Run Code Online (Sandbox Code Playgroud)

你需要qq,而不是qqww哪个列表.

您可以使用 fmt

(:ev<app>, :$!ak, :$!uu, :$!ifo, :$!st).fmt('"%s":"%s"', ',').fmt('{%s}')
Run Code Online (Sandbox Code Playgroud)

要么 JSON::Fast

require JSON::Fast <&to-json>;
{:ev<app>, :$!ak, :$!uu, :$!ifo, :$!st}.&to-json
Run Code Online (Sandbox Code Playgroud)

甚至

require JSON::Fast <&to-json>;
self.^attributes.map( {.name => .get_value(self)} ).Hash.&to-json
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法是禁用双引号字符串中的`{}`处理:`说qq:!c/{foo} /`将显示`{foo}`.我曾写过一篇关于所有引用方式的博客文章:https://perl6advent.wordpress.com/2014/12/16/quoting-on-steroids/ (3认同)