2014-12-01 14 views
0

我非常深刻的印象的Scala代码这样的编译时的安全性:Play框架的SQL运算符的编译时魔法是如何工作的?

val searchCountryPrefix:String = .... 

val sql = SQL""" 
    select 
    cn.name, cn.indepyear, c.name 
    from 
    city c 
    join country cn on c.id = cn.capital 
    where 
    cn.name like $searchCountryPrefix 
    """ 

...因为如果我在字符串中一个错字,并如使用错误的东西:

... 
    where 
    cn.name like $searchCountyPrefix -- instead of country, it says county 
    """ 

...然后Scala编译器捕获它并报告它。

我从来没有在除Lisp以外的其他语言中看到过这样的编译时魔法 - Play框架如何做到这一点?

更重要的是,我可以在自己的库中做这样的魔术编译时字符串检查吗?

在此先感谢您的帮助。

回答

3

这不是特定于Play的,它是Scala的一个特性。你可以在这里了解更多关于字符串插值的知识:http://docs.scala-lang.org/overviews/core/string-interpolation.html

+0

谢谢,这正是我所希望的!你能指出相关的代码吗?我想看看SQL内插器如何工作,以便我可以构建自己的内插器。 – ttsiodras 2014-12-01 17:15:34

+0

@ttsiodras你可以在这里找到Anorm代码:https://github.com/playframework/playframework/blob/2.3.6/framework/src/anorm/src/main/scala/anorm/package.scala#L48否则SIP已经很好地描述了如何编写自己的插值。 – vptheron 2014-12-01 17:27:10

+0

真棒,谢谢!我已经想到了这个Scala特性的许多用途。 – ttsiodras 2014-12-01 17:33:30

相关问题