[英]What Scala concepts are being used to make Scalatra DSL work?
我試圖通過嘗試使用Scalatra來進入Scala。 我不久前在課程上完成了Martin Odersky的課程,但我仍然很難理解這是如何工作的:
package com.example.app
import org.scalatra._
class HelloWorldApp extends ScalatraFilter {
get("/") {
<h1>Hello, {params("name")}</h1>
}
}
此示例取自Scalatra主頁: http : //www.scalatra.org/
如何執行此聲明:
get("/") { Hello, {params("name")} }
{}
是get()
方法的參數嗎? 你能解釋一下Scala語言的哪些特性在用嗎? Scalatra源代碼的指針將是完美的定義,這將是完美的。
get
在CoreDsl中定義如下
def get(transformers: RouteTransformer*)(block: => Any): Route
因此, get
需要兩個參數,一系列路由變換器(字符串被隱式轉換為路由變換器)和一個無參數方法,輸出Any
類型的東西。 這里有趣的部分是第二個參數。
首先要理解的是,作為函數參數的無參數方法是在Scala中專門處理的,即按名稱調用 ,參見自動類型相關的閉包構造以及Scala語言參考,第6.6節,p。 78,這是p。 PDF的86 :
具有無參數方法類型
=> T
的形式參數的情況被特別處理。 在這種情況下,在應用程序之前不評估相應的實際參數表達式e
。 相反,在重寫規則的右側使用形式參數需要重新評估e
。 換句話說,=>
參數的評估順序是按名稱調用,而正常參數的評估順序是按值調用 。
第二個方面是在函數應用程序中,參數可以包含在()
(“常規”參數)或{}
(更確切地說,在這種情況下,它們必須是塊表達式 ,它們甚至可以在新行上開始) ,請參閱函數應用程序的Scala語言參考,第6頁的第6.6節。 77,這是p。 85的PDF 。
另請注意,這兩個功能是如何使Scala成為定義DSL(或類似關鍵字的新功能)的有吸引力的語言的重要組成部分。
以下問題的部分內容可能也很有趣Scala中每個列表的多個參數列表和多個參數之間的區別是什么?
{}是get()方法的參數嗎?
是。 get
將有兩個參數列表。 一個用於路徑"\\"
,另一個用於塊執行。 塊包含在{}
,參數包含在()
。 所以你似乎必須把它稱為
class HelloWorldApp extends ScalatraFilter {
get("/") ({
<h1>Hello, {params("name")}</h1>
})
}
但是有一些語法糖允許傳遞{}
的單個參數而不必添加()
。 你會在這樣的事情中看到這種情況
myList foreach { do_something() }
它是一個非常有用的功能,用於編寫外觀,並且像新的控件結構一樣使用但實際上只是函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.