搜索
您的当前位置:首页正文

kotlin 基础 23 DSL (领域特定语言)

来源:二三娱乐
kotlin.jpeg

这些要感谢 Venkat Subramaniam 的有关 DSL 的讲座


venkat.jpg

作为我个人来说,自己看了 Venkat Subramaniam 的 presentation, 感觉将很清楚而且有深度。个人觉得受益匪浅所以在这里表示感谢。

学习许多有关 kotlin 语言本身对 DSL 的支持,这里我们来通过实践来整合一下学过的知识。要实现下面两个 DSL 语言。

2 days ago
2 days from now

先分析如何实现 2 days ago 这个语法,根据前面介绍我们感觉应该实现为2.day(aga)。2 是 Int 类型的对象,所以可以通过扩展 Int 类方法 days 并且让 days 接收一个 String 参数。那么就可以这样写。

val ago = "ago"

fun Int.days(tense:String){
    println("called")
}

还需要做点工作就是,去掉.(点)调用,怎么做之前已经介绍过了在 fun 前面加上修饰符 infix

infix fun Int.days(tense:String){
    println("called")
}
infix fun Int.days(tense:String){
    when(tense){
        ago ->
            println(LocalDateTime.now().minusDays(this.toLong()))
        else -> println("?")
    }
}
val ago = "ago"
val from_now = "from now"

infix fun Int.days(tense:String){
    when(tense){
        ago ->
            println(LocalDateTime.now().minusDays(this.toLong()))
        from_now ->
            println(LocalDateTime.now().minusDays(this.toLong()))
        else -> println("?")
    }
}

接下来实现一个难点,实现下面的语句,这里 3..15 表示为 3:15

"planning" meeting {
     start at 3..15
 }

我们打印一下

println(3..5)
println((3..5).javaClass)
class kotlin.ranges.IntRange

从简入难

class Meeting(name:String){
    
}

fun String.meeting():Meeting{
    return Meeting(this)
}
    "planning".meeting {
//        start at 3..15
    }
infix fun String.meeting(block:()->Unit):Meeting{
    return Meeting(this)
}
class Meeting(val name:String){
    val start = this
    infix fun at(time:IntRange){
        println("$name starts at $time")
    }
}

"planning" meeting {
        start at 3..15
    }
Learn-a-Programming-Language-Step-24.jpg
Top