当前位置: 首页 > news >正文

·温州公司建设网站南昌网站优化

·温州公司建设网站,南昌网站优化,番禺大石网站建设,武义建设工程网站DSL(领域特定语言) 常见的DSL就是SQL和正则表达式,用于操作数据库和文本字符串,Kotlin DSL通常为嵌套的Lambda表达式或链式方法,如 https://github.com/gradle/gradle-script-kotlin 用于构建Gradle脚本https://gith…

DSL(领域特定语言)

常见的DSL就是SQL和正则表达式,用于操作数据库和文本字符串,Kotlin DSL通常为嵌套的Lambda表达式或链式方法,如

  • https://github.com/gradle/gradle-script-kotlin 用于构建Gradle脚本
  • https://github.com/JetBrains/Exposed 用于操作数据库
  • https://github.com/Kotlin/kotlinx.html 用于生成HTML

带接收者的Lambda和扩展函数类型

对于普通的生成字符串函数,需要在Lambda中使用it指向StringBuilder实例

fun buildString(builderAction: (StringBuilder) -> Unit): String {val sb = StringBuilder()builderAction(sb)return sb.toString()
}val s = buildString {it.append("Hello ")it.append("World")
}println(s)

转换为带接收者的Lambda可通过this或直接调用方法

fun buildString(builderAction: StringBuilder.() -> Unit): String {val sb = StringBuilder()sb.builderAction()return sb.toString()
}val s = buildString {this.append("Hello ")append("World")
}println(s)

具体做法是使用扩展函数类型取代普通函数类型来声明参数的类型,将函数类型签名中的一个参数移到括号前面,并用一个.分割

(StringBuilder) -> Unit		//一个接收StringBuild参数、无返回值的函数
StringBuilder.() -> Unit	//将(接收者对象)参数往前移

也声明一个扩展函数类型的变量

val appendExcl: StringBuilder.() -> Unit = { this.append("!") }
val sb = StringBuilder("Hi")
sb.appendExcl()
println(sb)

Kotlin标准库中的apply和with就是利用扩展函数类型

public inline fun <T> T.apply(block: T.() -> Unit): T {.....block()			//apply的接收者被当作lambda的接收者return this		//返回接收者
}public inline fun <T, R> with(receiver: T, block: T.() -> R): R {......return receiver.block()		//返回调用Lambda的结果
}

HTML构建器

用于Html的Kotlin DSL叫做HTML构建器,其是类型安全的

open class Tag(val name: String) {private val children = mutableListOf<Tag>()protected fun <T : Tag> doInit(child: T, init: T.() -> Unit) {child.init()children.add(child)}override fun toString() = "<$name>${children.joinToString("")}</$name>"
}fun table(init: TABLE.() -> Unit) = TABLE().apply(init)class TABLE : Tag("table") {fun tr(init: TR.() -> Unit) = doInit(TR(), init)
}class TR : Tag("tr") {fun td(init: TD.() -> Unit) = doInit(TD(), init)
}class TD : Tag("td")fun createTable() =table {tr {td {}}}

调用

println(createTable())<table><tr><td></td></tr></table>

invoke约定

重写invoke()可以让对象像函数一样调用,p(1)会被编译成p.invoke(1)

class Person(val name: String) {operator fun invoke(age: Int) {println("$name,$age")}
}val p = Person("A")
p(1)

Gradle中的DSL

class DependencyHandler {fun compile(coordinate: String) {println("add dependency on $coordinate")}operator fun invoke(body: DependencyHandler.() -> Unit) {body()}
}val dependencies = DependencyHandler()dependencies.compile("com.demo.demo-lib:1.0.0")dependencies {compile("com.demo.demo-lib:1.0.0")
}

中缀调用的DSL

对于下面的DSL

infix fun <T> T.should(matcher: Matcher<T>) = matcher.test(this)interface Matcher<T> {fun test(value: T)
}class startWith(val prefix: String) : Matcher<String> {override fun test(value: String) {if (!value.startsWith(prefix)) {throw AssertionError("$value does not start with $prefix")}}

可使用中缀调用

"kotlin" should startWith("kot")"kotlin".should(startWith("kot"))

还可利用包装类进一步简化,利用obetject对象选择不同类型的should()重载方法

object start
infix fun String.should(x: start): StartWrapper = StartWrapper(this)
class StartWrapper(val value: String) {infix fun with(prefix: String) =if (!value.startsWith(prefix))throw AssertionError("$value does not start with $prefix")elseprintln("success")
}
"kotlin" should start with ("kot")"kotlin".should(start).with("kot")

基本数据类型上定义扩展

val Int.days: Periodget() = Period.ofDays(this)val Period.ago: LocalDateget() = LocalDate.now() - thisval Period.fromNow: LocalDateget() = LocalDate.now() + this

通过扩展函数实现获取一天前和一天后的日期

println(1.days.ago)
println(1.days.fromNow)
http://www.yayakq.cn/news/248763/

相关文章:

  • 修改数据库密码 进不了网站后台双wordpress自动同步文章
  • 做网店去哪个网站货源好为企业做好服务保障
  • 小地方的旅游网站怎么做wordpress修改字体
  • 网站可信认证必须做吗公司名称怎么取名
  • 怎么不花钱建立网站网站开发模板下载
  • 南宁做网站公司品牌云尚网络网站虚拟主机行吗
  • 网站姐姐做床戏网站平台公司实体化转型
  • 建网站 视频的网址深圳商城网站建设公司
  • 合肥 做网站的图片网站如何优化
  • 做网站项目前期工作包括哪些摄影网站免费源码
  • 东营网站建设价钱表自贡跨省特大虚假广告案
  • 网站名称与域名wordpress form 美化
  • 丽水微信网站建设价格网站建设的相关书籍
  • 那个公司做的外贸网站好婚庆公司多少钱
  • 对企业网站建设的建议免费咨询承诺书
  • 网站建设需要用到的软件兼职网站编程
  • 徐州网站建设招聘网广州公司注册流程及材料
  • 做网站要租服务器淘客单网站
  • 球迷类的网站如何做wordpress模板标签查询
  • 网站转化率低网站内容采编怎么做
  • c 语言可以做网站吗站长之家源码
  • 网站建设新闻资讯新乡市建设工程信息网
  • 宜昌公司做网站seo引擎搜索网站关键词
  • 北京 响应式网站建设桂林市做网站的公司
  • 单本小说网站源码微信h5页面模板
  • 湛江网站设计公司地址市场营销案例100例
  • 电子商务网站的目的制作企业网站新闻列表页面网页设计
  • 网站建立好了自己怎么做优化天津星创网站建设有限公司
  • 网站制作企业有哪些十堰最专业的网站建设公司
  • 银行网站开发技术方案建筑工程承包方式