使用g8从模板创建项目时遇异常:'created'意外出现
giter8模板创建项目时出现'created'解析错误的原因及解决办法
这个问题我之前也碰到过,本质是giter8(g8)的模板语法和Scala的字符串插值语法冲突导致的,具体原因和解决办法如下:
错误原因
g8模板引擎会把文件中的$符号当作模板变量的起始标记,自动尝试解析后续内容为模板变量。在你的代码里,Scala字符串插值${user.name}中的$被g8误识别了:
- g8试图将
user.name当作一个g8模板变量处理,但这个变量在你的模板上下文里根本不存在 - 当g8解析到
${user.name}之后的created时,完全不符合它的模板语法规则,所以抛出了"`created' came as a complete surprise to me"的错误
解决办法
要让g8忽略Scala代码中的字符串插值$,需要用**双重美元符号$$**来转义。g8在生成项目时会自动把$$替换成单个$,最终生成的Scala代码就能保留正确的字符串插值语法。
修改后的代码片段如下:
class UserRegistryActor extends Actor with ActorLogging { import UserRegistryActor._ var users = Set.empty[User] def receive: Receive = { case GetUsers => sender() ! Users(users.toSeq) case CreateUser(user) => users += user sender() ! ActionPerformed(s"User $$${user.name} created.") // 转义$符号 case GetUser(name) => sender() ! users.find(_.name == name) case DeleteUser(name) => users.find(_.name == name) foreach { user => users -= user } sender() ! ActionPerformed(s"User $$name deleted.") // 同样转义$符号 } }
需要注意:所有Scala字符串插值里的$都要这样转义,包括简单的$name也要改成$$name,否则g8都会尝试将其当作模板变量解析,引发类似错误。
内容的提问来源于stack exchange,提问作者igx
相关产品推荐
相关产品推荐

