当我在Apache官方网站上找到Velocity项目指南时,我们不能通过#set使用布尔变量,但当我在项目中使用时,它也可以工作。
#set
#set($isRight=true) #if($isRight) ##execute #end #set($isRight=false) #if($isRight) ##not execute #end
我想知道velocity是否支持#set布尔变量以及我使用的方式是否法律的。
vaj7vani1#
在velocity中,没有显式的数据类型,因此不支持布尔变量。但由于velocity是在JAVA平台上构建的,如果您指定一个兼容的值,那么它可以在诸如“if”操作之类的操作中给予您预期的结果(代码中显示的那个)。这是因为在Java中,在if表达式中需要一个布尔值,而您提供的内容可以很容易地转换为布尔值。如果你给予#set($是正确的=真1),Java引擎将在内部处理上面编写的代码,就像您在“if”表达式中指定了一个字符串一样,该表达式无法强制转换为布尔值,因此将引发类型强制转换异常(或ClassCastException)。这将在使用“true”或“false”以外的任何值时发生它们在这里实际上是字符串,但可以成功地转换为布尔值,这在“if”表达式中是预期的。因此,这不是布尔类型支持,而是幕后的Java实现使事情工作。
uqdfh47h2#
经验表明,您的示例是有效的,但是您是对的,文档没有明确说明您可以使用#set指令为变量赋值 Boolean 值(有一些非常详细的情况,其中缺乏关于 Boolean 的信息)。因此,如果你想确保你编写的代码与文档100%兼容,那么你可以使用其他值来代替显式的 Boolean,根据文档,这些值将被转换为 Boolean。例如,0对应false,1对应true。那么您的示例将如下所示:
0
false
1
true
#set ($isRight = 1) #if ($isRight) ## execute #end #set ($isRight = 0) #if ($isRight) ## not execute #end
oewdyzsn3#
尚未发布的Velocity 2.0确实支持此类测试。同时,您可以求助于#if("$isRight"=="true")...
#if("$isRight"=="true")...
3条答案
按热度按时间vaj7vani1#
在velocity中,没有显式的数据类型,因此不支持布尔变量。但由于velocity是在JAVA平台上构建的,如果您指定一个兼容的值,那么它可以在诸如“if”操作之类的操作中给予您预期的结果(代码中显示的那个)。这是因为在Java中,在if表达式中需要一个布尔值,而您提供的内容可以很容易地转换为布尔值。
如果你给予#set($是正确的=真1),Java引擎将在内部处理上面编写的代码,就像您在“if”表达式中指定了一个字符串一样,该表达式无法强制转换为布尔值,因此将引发类型强制转换异常(或ClassCastException)。这将在使用“true”或“false”以外的任何值时发生它们在这里实际上是字符串,但可以成功地转换为布尔值,这在“if”表达式中是预期的。
因此,这不是布尔类型支持,而是幕后的Java实现使事情工作。
uqdfh47h2#
经验表明,您的示例是有效的,但是您是对的,文档没有明确说明您可以使用
#set
指令为变量赋值 Boolean 值(有一些非常详细的情况,其中缺乏关于 Boolean 的信息)。因此,如果你想确保你编写的代码与文档100%兼容,那么你可以使用其他值来代替显式的 Boolean,根据文档,这些值将被转换为 Boolean。例如,
0
对应false
,1
对应true
。那么您的示例将如下所示:
oewdyzsn3#
尚未发布的Velocity 2.0确实支持此类测试。
同时,您可以求助于
#if("$isRight"=="true")...