2009年4月15日星期三

FreeMarker中文手册--KLW 表达式


本页内容:

  • 快速浏览(备忘单)

  • 直接赋值

  • 取值

  • 字符串操作

  • 序列(数组)操作

  • 哈希操作

  • 算术运算

  • 比较运算

  • 逻辑操作

  • 方法调用

  • 处理缺失值

  • 括号

  • 表达式中的空白

  • 操作符优先级


当你给内插表达式或者指令参数提供值的时候,你可以使用变量或者更复杂的表达式.例如,x是数值8,y是数值5, (x + y)/2的值会是6.5.

在我们进入具体细节之前,先看一些具体的例子:

  • 当你为内插表达式提供值时:使用方法是${表达式}.这里的表达式是你要在文本输出中的值.如${(5 + 8)/2} 会打印”6.5”.(也有可能是是”6,5”,如果你输出的语言环境不是英语的话.)

  • 当你给指令提供参数时:你已经在入门章节见过if指令.这个指令的语法是: <#if 表达式>...</#if>.这里的表达式必须是一个布尔值.例如: <#if 2 < 3>,2 < 3(2小于3)是一个布尔表达式(结果为true).


快速浏览(备忘单)

  • 直接赋值


    • 字符串: "Foo" 或者 'Foo' 或者"It's \"quoted\"" 或者r"C:\raw\string"

    • 数值: 123.45

    • 布尔值: true, false

    • 序列(数组): ["foo", "bar", 123.45], 1..100

    • 哈希: {"name":"green mouse", "price":150}


  • 取值


    • 顶层变量: user

    • 从哈希中取值: user.name, user["name"]

    • 从序列中取值: products[5]

    • 特定变量: .main


  • 字符串操作


    • 内插表达式 (或者连接操作): "Hello ${user}!" (or "Free" + "Marker")

    • 取得一个字符: name[0]


  • 序列操作

    • 连接: users + ["guest"]

    • 序列片段: products[10..19] 或 products[5..]

  • 哈希操作

    • 连接: passwords + {"joe":"secret42"}

  • 算术运算: (x * 1.5 + 10) / 2 - y % 100

  • 比较: x == y, x != y, x < y, x > y, x >= y, x <= y, x < y, ...等.

  • 逻辑运算: !registered && (firstVisit || fromEurope)

  • 内置函数: name?upper_case

  • 方法调用: repeat("What", 3)

  • 缺失值处理:

    • 默认值: name!"unknown" 或(user.name)!"unknown" 或name! 或(user.name)!

    • 测试值是否缺失: name?? 或(user.name)??



直接赋值
经常你会直接使用具体值,而不是使用一些计算结果.
字符串
直接使用字符串的话,你在文本上加引号即可,如"some text",或者使用单引号,如 'some text'.这两种形式是等价的.如果字符串本身包含着引号(“或者’)或者反斜杠”\”,你需要加上前置的反斜杠,这称为转义.其他的字符你都可以直接输入,包括换行符.例如:

${"It's \"quoted\" and
this is a backslash: \\"}

${'It\'s "quoted" and
this is a backslash: \\'}

输出结果:

It's "quoted" and
this is a backslash: \

It's "quoted" and
this is a backslash: \

注意
当然,你也直接将文本写在模版中,而不使用 ${...}.这里只是作为例子展示表达式中如何直接使用字符串.

下表是所有支持的转移字符.在模版中使用反斜杠来转义其它字符会导致模版出错.

转义字符意义
\"双引号(u0022)
\'单引号 (u0027)
\\反斜杠 (u005C)
\n换行符 (u000A)
\r回车符 (u000D)
\t水平制表符(u0009)
\b退格符 (u0008)
\f换页符(u000C)
\l小于号: <
\g大于号: >
\a&
\xCode使用16进制unicode表示符号


\x之后的code是1到4位的16进制数字.例如,在字符串中表示一个版权信息: "\xA9 1999-2001", "\x0A9 1999-2001", "\x00A9 1999-2001".你必须使用1到4位的16进制数字,否则FreeMarker会很迷茫的,呵呵.

注意到字符”${”和”#{”有特殊意义,它是用来插入值或者表达式的,(如"Hello ${user}!",变量user的值会插入到字符串中.)如果你想打印${,你需要使用原始字符串.

所谓原始字符串,指的是,在原始字符串何总反斜杠和${没有特别意义,会被当做普通文本输出.指明一个字符串是一个原始字符串,在引号前加字母r,例如:

${r"${foo}"}
${r"C:\foo\bar"}

输出:

${foo}
C:\foo\bar

没有评论: