WebApp::Template 条件行为和变量的使用
WebApp::Template condition behaviour and use of variables
使用提供的模板语言,我始终可以访问 $_ 或哈希引用进行迭代,这很好。
# 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> </@>
</?>
但是测试不存在的 key/value <?{.not-here}> ...</?>
会抛出异常,这是正常行为吗?
我认为变量,如文档中未说明的那样,仅在从与路由上下文无关的模板子例程调用它们时才可用(如测试文件所示:https://github.com/croservices/cro-webapp/blob/master/t/test-data/cond-var.crotmp)。同样测试不存在的变量也会抛出异常。
<.foo>
取消引用的文档如下:
If the current topic does the Associative role, then this form will prefer to take the value under the name hash key, falling back to looking for a method name if there is no such key.
因此,如果没有这样的键,那么它确实会回退到方法调用,并且(在 Raku 中通常是这种情况)如果没有这样的方法就会出错。所以是的,这是预期的行为。
还有一些明确的形式,它们总是会进行哈希访问(软失败)或方法分派(如果没有这样的方法,则会出错。再次引用文档的相关部分:
<.elems()>
will always be a method call, even if used on an Associative
(so can be used to overcome the key fallback)
<.<elems>>
will always be a hash index
这些在整个模板语言中一致适用,因此可以使用 <$var<foo>>
或 <?{ $var<foo> }>
(假设文档可能会更清楚地说明这一点)。
模板顶层范围内的唯一变量是 $_
,它被初始化为调用 template
时传递的值。迭代、子例程和宏都可能引入变量。如文档中所述:
It is a template compilation time error to refer to a variable that does not exist.
这意味着它们遵循与 Raku 中的词法变量相同的规则。该错误是在模板编译时产生的,这意味着可以编写一个编译所有模板的单元测试,以确保至少不存在这种错误。
一般来说,模板语言遵循 Raku 语义,唯一的显着差异是 <.foo>
作用于 Associative
更像 .<foo>:exists ?? .<foo> !! .foo
的东西。
使用提供的模板语言,我始终可以访问 $_ 或哈希引用进行迭代,这很好。
# 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> </@>
</?>
但是测试不存在的 key/value <?{.not-here}> ...</?>
会抛出异常,这是正常行为吗?
我认为变量,如文档中未说明的那样,仅在从与路由上下文无关的模板子例程调用它们时才可用(如测试文件所示:https://github.com/croservices/cro-webapp/blob/master/t/test-data/cond-var.crotmp)。同样测试不存在的变量也会抛出异常。
<.foo>
取消引用的文档如下:
If the current topic does the Associative role, then this form will prefer to take the value under the name hash key, falling back to looking for a method name if there is no such key.
因此,如果没有这样的键,那么它确实会回退到方法调用,并且(在 Raku 中通常是这种情况)如果没有这样的方法就会出错。所以是的,这是预期的行为。
还有一些明确的形式,它们总是会进行哈希访问(软失败)或方法分派(如果没有这样的方法,则会出错。再次引用文档的相关部分:
<.elems()>
will always be a method call, even if used on anAssociative
(so can be used to overcome the key fallback)<.<elems>>
will always be a hash index
这些在整个模板语言中一致适用,因此可以使用 <$var<foo>>
或 <?{ $var<foo> }>
(假设文档可能会更清楚地说明这一点)。
模板顶层范围内的唯一变量是 $_
,它被初始化为调用 template
时传递的值。迭代、子例程和宏都可能引入变量。如文档中所述:
It is a template compilation time error to refer to a variable that does not exist.
这意味着它们遵循与 Raku 中的词法变量相同的规则。该错误是在模板编译时产生的,这意味着可以编写一个编译所有模板的单元测试,以确保至少不存在这种错误。
一般来说,模板语言遵循 Raku 语义,唯一的显着差异是 <.foo>
作用于 Associative
更像 .<foo>:exists ?? .<foo> !! .foo
的东西。