赞
踩
DSL的全称是领域特定语言(Domain Specific Language),它是编程语言赋予开发者的一 种特殊能力,通过它我们可以编写出一些看似脱离其原始语法结构的代码,从而构建出一种专 有的语法结构。
- dependencies {
- implementation 'com.squareup.retrofit2:retrofit:2.6.1'
- implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
- }
Gradle是一种基于Groovy语言的构建工具,因此上述的语法结构其实就是Groovy提供的DSL 功能。有没有觉得很神奇?不用吃惊,借助Kotlin的DSL,我们也可以实现类似的语法结构,下 面就来具体看一下吧。
第一步、
首先新建一个DSL.kt文件,然后在里面定义一个Dependency类,代码如下所示:
- class Dependency {
- val libraries = ArrayList<String>()
- fun implementation(lib: String) {
- libraries.add(lib)
- }
- }
这里我们使用了一个List集合来保存所有的依赖库,然后又提供了一个implementation()方 法,用于向List集合中添加依赖库,代码非常简单。
接下来再定义一个dependencies高阶函数,代码如下所示:
- fun dependencies(block: Dependency.() -> Unit): List<String> {
- val dependency = Dependency()
- dependency.block()
- return dependency.libraries
- }
可以看到,dependencies函数接收一个函数类型参数,并且该参数是定义到Dependency类 中的,因此调用它的时候需要先创建一个Dependency的实例,然后再通过该实例调用函数类 型参数,这样传入的Lambda表达式就能得到执行了。最后,我们将Dependency类中保存的 依赖库集合返回
没错,经过这样的DSL设计之后,我们就可以在项目中使用如下的语法结构了:
- dependencies {
- implementation("com.squareup.retrofit2:retrofit:2.6.1")
- implementation("com.squareup.retrofit2:converter-gson:2.6.1")
- }
简单解释一下。由于dependencies函数接收一个函数类型参数,因此这里我们可以 传入一个Lambda表达式。而此时的Lambda表达式中拥有Dependency类的上下文,因此当 然就可以直接调用Dependency类中的implementation()方法来添加依赖库了。
当然,这种语法结构和我们在build.gradle文件中使用的语法结构并不完全相同,这主要是因 为Kotlin和Groovy在语法层面还是有一定差别的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。