【问题标题】:Does Kotlin have method-CALL labels?Kotlin 有方法调用标签吗?
【发布时间】:2016-08-20 00:25:56
【问题描述】:

我正在从 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 上启用标签?

【问题讨论】:

    标签: kotlin self-documenting-code


    【解决方案1】:

    据我所知,没有编译器选项可以强制使用这种语法,但您仍然可以在代码中使用它,请参阅文档: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
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多