7

使用提供的模板语言,我总是可以访问 $_ 或 Hash 引用以进行迭代,这很好。

# In routes
get -> 'somestuff' {
  my $stuff = %{ arr => [ {stuff => 'stuff1' , nbr => 1 }, {stuff => 'stuff2', nbr => 2 } ] };
  template 'somestuff.crotpl', $stuff;
}
# In somestuff.crotpl
<?$_.elems>
<$_> <br>
<@arr> <.stuff> = <.nbr> <br> </@>  
</?>

但是测试不存在的键/值<?{.not-here}> ...</?>会引发异常,这是正常行为吗?

我似乎文档中未说明的变量仅在从与路由上下文无关的模板子例程中调用它们时才可用(如测试文件所示:https ://github.com/croservices/cro- webapp/blob/master/t/test-data/cond-var.crotmp)。对不存在的变量进行测试也会引发异常。

4

1 回答 1

7

取消引用的文档<.foo>如下:

如果当前主题扮演关联角色,那么此表单将更倾向于获取名称哈希键下的值,如果没有这样的键,则回退到寻找方法名称。

因此,如果没有这样的键,那么它确实会退回到方法调用,并且(在 Raku 中通常是这种情况)如果没有这样的方法是错误的。所以是的,这是预期的行为。

还有一些明确的形式总是会进行哈希访问(软故障)或方法分派(如果没有这种方法,则会出错。再次引用文档的相关位:

  • <.elems()>将始终是方法调用,即使在 an 上使用Associative(因此可用于克服密钥后备)
  • <.<elems>>将始终是哈希索引

这些在模板语言中一致地应用,因此<$var<foo>>或者<?{ $var<foo> }>可以使用(授予文档可能会更清楚地说明这一点)。

模板顶层范围内的唯一变量是$_,它被初始化为调用时传递的值template。迭代、子例程和宏都可能引入变量。如文档中所述:

引用不存在的变量是模板编译时错误。

这意味着它们遵循与 Raku 中的词汇变量相同的规则。该错误是在模板编译时产生的,这意味着可以编写一个编译所有模板的单元测试,以确保至少不存在这种错误。

一般来说,模板语言遵循 Raku 语义,唯一的显着差异是<.foo>作用于Associative更像.<foo>:exists ?? .<foo> !! .foo.

于 2019-11-20T18:22:14.420 回答