Есть ли у Kotlin метки method-CALL?

Я переезжаю из Свифта в Котлин и до сих пор люблю это. Тем не менее, я привык объявлять такие методы (притворяться, что указанные методы существуют и работают):

// 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?

1 ответ

Решение

Насколько я знаю, компилятор не может использовать этот синтаксис, но вы все равно можете использовать его в своем коде, см. Docs: Именованные аргументы.

Короче говоря, синтаксис вашей функции

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
    
Другие вопросы по тегам