«Если последний аргумент лямбда передается в вызов функции вне скобок, передача значений по умолчанию для параметров не допускается» - PullRequest
0 голосов
/ 23 февраля 2019

Я читаю раздел Аргументы по умолчанию в документации Kotlin, и я наткнулся на этот информационный блок:

Но если последний аргумент лямбда передается вВызов функции вне скобок, передача значений по умолчанию для параметров не допускается:

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { ... }

foo(1) { println("hello") } // Uses the default value baz = 1 
foo { println("hello") }    // Uses both default values bar = 0 and baz = 1

Я пытаюсь понять, что здесь говорится.

Мне известно, что для первых двух параметров не нужно передавать значения.Третий параметр, кажется, является функцией, возвращающей тип Unit.

Это все, что я получил из их объяснения: But if a last argument lambda is passed to a function call outside the parentheses, passing no values for the default parameters is allowed

Я понимаю, что третий параметр не нуженбыть переданным в?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Обновление: документы были обновлены , надеюсь, новая формулировка более понятна.

Оригинальный ответ ниже.


Вам нужен контекстпредыдущее предложение и блок кода для этого имеют смысл:

Если параметр по умолчанию предшествует параметру без значения по умолчанию, значение по умолчанию можно использовать только путем вызова функции с именованными аргументами:

fun foo(bar: Int = 0, baz: Int) { ... }
​
foo(baz = 1) // The default value bar = 0 is used

Но если лямбда последнего аргумента передается в вызов функции вне скобок, то передача значений по умолчанию для параметров не допускается:

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { ... }
​
foo(1) { println("hello") } // Uses the default value baz = 1 
foo { println("hello") }    // Uses both default values bar = 0 and baz = 1

Так что в общем случаеЕсли бы у вас были значения по умолчанию для всех, кроме последнего параметра, вам пришлось бы явно указывать последний параметр при вызове функции только с этим параметром, поскольку компилятор не мог бы знать, что выпытаясь передать этот конкретный параметр, а не просто тот, который первый в списке параметров.

Однако, поскольку синтаксис передачи влямбда вне скобок вызова функции ограничена лямбдами, которые являются самым последним параметром функции , компилятор может выяснить, что вы пытаетесь передать qux во втором примере.

0 голосов
/ 23 февраля 2019

Но если лямбда последнего аргумента передается в вызов функции вне скобок, передача значений по умолчанию для параметров не допускается.

Это означает, что вы можете вызвать foo функциюбез скобок, таких как:

foo { println("hello") } 
or
foo(1) { println("hello") }
or
foo(1, 2) { println("hello") }

С скобками это будет выглядеть так (обратите внимание, что в первых двух примерах нам нужно указать имя параметра qux):

foo(qux = { println("hello") })
or
foo(1, qux = { println("hello") })
or
foo(1, 2, { println("hello") })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...