Kotlin 有方法调用标签吗?
Does Kotlin have method-CALL labels?
我正从 Swift 转移到 Kotlin,到目前为止我很喜欢它。但是,我习惯于这样声明方法(假装引用的方法存在并起作用):
// Swift method declaration
func drawCircle(inRect rect: CGRect, antialiased: Bool) {
super.antialiased = antialiased
super.drawCircle(inRect: rect)
}
并这样称呼他们:
drawCircle(inRect:myRect, antialiased: false)
自成文档,读起来像英文。然而,在 Kotlin 中,类似这样的方法:
fun drawCircle(inRect: Rectangle, antialiased: Boolean) {
super.antialiased = antialiased
super.drawCircle(inRect)
}
使用名为 inRect
的变量已经开始听起来很奇怪了。但是当我调用它时它变得更糟:
drawCircle(myRect, false)
这里我们看到了最大的问题:仅通过阅读这一行就可以猜到 myRect
是一个矩形,其中将绘制圆。然而,什么是true
?它可能是抗锯齿,是的,但也可能是不透明地绘制它,或者是否要绘制它的一些切换!无论如何,我可以举出更多 Swift 和 Objective-C 程序员喜欢带有方法调用的标签的原因,但我已经表达了我的观点。
有什么方法可以在 Kotlin 中的方法 call 上启用标签吗?
据我所知,没有强制使用此语法的编译器选项,但您仍然可以在代码中使用它,请参阅文档:Named arguments.
简而言之,函数的语法是
drawCircle(inRect = myRect, antialiased = false)
您甚至可以在使用命名参数的调用中更改函数参数的顺序。
drawCircle(antialiased = false, inRect = myRect)
限制是:
您不能使用此语法调用 Java 方法,因为 Java 字节码并不总是保留参数名称;
混合定位(未命名)和命名参数是有限的:所有命名参数都应该在定位参数之后:
fun f(x: Int, y: Int, z: Int) = 0
f(x = 0, y = 0, z = 0) // OK
f(0, y = 0, z = 0) // OK
f(0, z = 0, y = 0) // OK
f(x = 0, 0, 0) // Error
我正从 Swift 转移到 Kotlin,到目前为止我很喜欢它。但是,我习惯于这样声明方法(假装引用的方法存在并起作用):
// Swift method declaration
func drawCircle(inRect rect: CGRect, antialiased: Bool) {
super.antialiased = antialiased
super.drawCircle(inRect: rect)
}
并这样称呼他们:
drawCircle(inRect:myRect, antialiased: false)
自成文档,读起来像英文。然而,在 Kotlin 中,类似这样的方法:
fun drawCircle(inRect: Rectangle, antialiased: Boolean) {
super.antialiased = antialiased
super.drawCircle(inRect)
}
使用名为 inRect
的变量已经开始听起来很奇怪了。但是当我调用它时它变得更糟:
drawCircle(myRect, false)
这里我们看到了最大的问题:仅通过阅读这一行就可以猜到 myRect
是一个矩形,其中将绘制圆。然而,什么是true
?它可能是抗锯齿,是的,但也可能是不透明地绘制它,或者是否要绘制它的一些切换!无论如何,我可以举出更多 Swift 和 Objective-C 程序员喜欢带有方法调用的标签的原因,但我已经表达了我的观点。
有什么方法可以在 Kotlin 中的方法 call 上启用标签吗?
据我所知,没有强制使用此语法的编译器选项,但您仍然可以在代码中使用它,请参阅文档:Named arguments.
简而言之,函数的语法是
drawCircle(inRect = myRect, antialiased = false)
您甚至可以在使用命名参数的调用中更改函数参数的顺序。
drawCircle(antialiased = false, inRect = myRect)
限制是:
您不能使用此语法调用 Java 方法,因为 Java 字节码并不总是保留参数名称;
混合定位(未命名)和命名参数是有限的:所有命名参数都应该在定位参数之后:
fun f(x: Int, y: Int, z: Int) = 0 f(x = 0, y = 0, z = 0) // OK f(0, y = 0, z = 0) // OK f(0, z = 0, y = 0) // OK f(x = 0, 0, 0) // Error