《第一行程式碼》Kotlin講堂知識整理——第13章 使用DSL構建專有的語法結構
阿新 • • 發佈:2021-04-23
13.7 使用DSL構建專有的語法結構
DSL的全稱是領域特定語言(Domain Specific Language),它是程式語言賦予開發者的一種特殊能力,通過它我們可以編寫出一些看似脫離原始語法結構的程式碼,從而構建出一種專有的語法結構。
本章的學習目標是通過告誡函式的方式來實現DSL,這也是Kotlin中實現DSL中最常見的方式。
長久以來,我們都有在使用DSL,比如我們平時新增依賴庫的時候,需要在build.gradle檔案中編寫以下內容:
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"
}
以上語法其實就是Groovy提供的DSL功能。
是不是很神奇,不用吃驚,我們可以藉助Kotlin的DSL實現類似的語法結構。
首先定義一個DSL.kt檔案,然後在裡面定義一個Dependency
類,程式碼如下
class Dependency {
val libraries = ArrayList<String>()
fun implementation(lib: String) {
libraries. add(lib)
}
}
再定義一個高階函式,程式碼如下:
fun dependencies(block: Dependency.() -> Unit): List<String> {
val dependency = Dependency()
dependency.block()
return dependency.libraries
}
這樣以來我們就可以在專案中使用如下的語法結構了:
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" )
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0")
}
簡單解釋一下。
由於dependencies
函式接收一個函式型別引數。
因此這裡我們可以傳入一個Lambda表示式。
而此時的Lambda表示式中擁有Dependency
類的上下文,因此當然就可以直接呼叫Dependency
類中的implementation()
方法來新增依賴庫了。
我們定義一個測試方法,來試驗一下。
fun main() {
val libraries = dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0")
}
for (library in libraries) {
println(libraries)
}
}
執行後檢視輸出。
這樣就實現了一個較為簡單的DSL,下面再編寫一個複雜一點的DSL。
// 待補充
附上文中程式碼地址