簡體   English   中英

什么Scala概念用於使Scalatra DSL工作?

[英]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源代碼的指針將是完美的定義,這將是完美的。

getCoreDsl中定義如下

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM