Sup*_*tar 2 self-documenting-code kotlin
我正从Swift搬到Kotlin,到目前为止一直很喜欢它.但是,我习惯于声明这样的方法(假装引用的方法存在并且工作):
// Swift method declaration
func drawCircle(inRect rect: CGRect, antialiased: Bool) {
super.antialiased = antialiased
super.drawCircle(inRect: rect)
}
Run Code Online (Sandbox Code Playgroud)
并称他们为:
drawCircle(inRect:myRect, antialiased: false)
Run Code Online (Sandbox Code Playgroud)
这是一个精美的自我记录,读起来像英语.但是,在Kotlin中,类似的方法如下:
fun drawCircle(inRect: Rectangle, antialiased: Boolean) {
super.antialiased = antialiased
super.drawCircle(inRect)
}
Run Code Online (Sandbox Code Playgroud)
使用名为的变量已经开始听起来很奇怪inRect.但是当我打电话时它会变得更糟:
drawCircle(myRect, false)
Run Code Online (Sandbox Code Playgroud)
在这里,我们看到了最大的问题:人们可以通过单独阅读这条线来猜测,这myRect是一个将绘制圆的矩形.但是,是什么true?它可能是抗锯齿,是的,但它也可能是不透明地绘制它,还是一些关于是否要绘制它的切换!无论如何,我可以举出更多理由说明为什么Swift和Objective-C程序员喜欢用方法调用他们的标签,但我已经说明了我的观点.
有没有办法在Kotlin中启用方法调用标签?
据我所知,没有强制使用此语法的编译器选项,但您仍然可以在代码中使用它,请参阅docs:Named arguments.
简而言之,您的函数的语法是
drawCircle(inRect = myRect, antialiased = false)
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用命名参数在调用中更改函数参数顺序.
drawCircle(antialiased = false, inRect = myRect)
Run Code Online (Sandbox Code Playgroud)
限制是:
您不能使用此语法调用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
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |