python kotlin
介绍
Kotlin可能现在是我最喜欢的语言,可能它提供的最酷的功能之一是基于几个功能构建的类型安全的生成器(稍后解释)。 我发现自己真的很想在其他两种主要语言(Java和Python)中使用此功能。 本文解释了我认为与使用这些语言的类型安全的构建器最接近的东西。
Kotlin
首先,我需要说明Kotlin进行类型安全的构建器的能力。 要快速了解这些构建器的含义,您应该查看有关它们的页面 。 在本文中,我们将实现其html构建器的一小部分。
Kotlin创建类型安全的构建器的能力归功于许多小功能。 第一个是lambda语法; {param, list -> block.of.code()}
。 如果lambda的参数为零,则可以忽略参数列表和箭头。 当它只有一个参数时,也是如此,因为该参数被隐式称为it
。 例如, {doSomethingWith(it)}
是合法的lambda,假设doSomethingWith()
接受的对象与传递给lambda的对象的类型相同。
下一个功能是如何将lambda传递给函数。 如果最后一个参数是lambda,则可以在函数调用的括号后传递该参数。 例如, myFunc(arg1){lambdaArg()}
。 如果lambda是唯一的参数,则可以完全忽略括号: aFunc{lambdaArg()}
。 这使您可以定义看起来像语言功能的功能。 如果不是因为保留了这些关键字,就可以从技术上定义自己的if-else块或任何循环。
接下来是扩展方法,您可以定义像它们一样工作的lambda。 扩展方法是为接口类之外的类或接口定义的新方法。 例如,您可以为String
类创建新的方法。 实际上,它们只是静态方法,它们采用其所针对类型的隐式第一个参数。 在Kotlin代码中,第一个参数分配给this
标识符, this
标识符隐式使用,就像在实际方法中一样。
您也可以定义像扩展方法一样工作的lambda( SomeClass.() -> Unit
而不是(SomeClass) -> Unit
),以便在lambda内部,您可以调用对象而无需显式引用它。
所有这些功能,再加上非常好的类型推断,共同构成了一种功能,可以从使用扩展lambda的函数中创建类型安全的构建器。 因此,我们可以这样写:
html {
head {
title("A Title")
}
body {
p = "paragraph"
p = "'nother one"
p = "last paragraph"
}
}
要返回Html
包含对象Head
和Body
,将Head
包含Title
与文字,“A标题”。 Body
包含3个Paragraphs
。
您可能会注意到title
和[p]的定义方式不同。 它可能会是聪明有title
使用=
语法代替p
,但p
展示了这些建设者如何素材可以是优于title
。 我用Python做过类似的事情,因为它也支持属性。
我们来看一下允许创建这些对象的Kotlin代码
fun html(htmlBuilder: Html.() -> Unit): Html {
val html = Html()
html.htmlBuilder()
return html
}
class Html {
private var head: Head? = null
private var body: Body? = null
fun head(headBuilder: Head.() -> Unit) {
head