1. 程式人生 > 其它 >《第一行程式碼》Kotlin講堂知識整理——第13章 使用DSL構建專有的語法結構

《第一行程式碼》Kotlin講堂知識整理——第13章 使用DSL構建專有的語法結構

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。

// 待補充

附上文中程式碼地址

《第一行程式碼》Kotlin講堂知識整理