2014-12-01 13 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

相關問題