Странное поведение функций высшего порядка и преобразование SAM в Котлине - PullRequest
0 голосов
/ 05 июня 2018

Этот вопрос относится к моему предыдущему вопросу: Изменение анонимной функции для вызова другой анонимной функции в Kotlin

Я написал функцию, которая будет изменять прослушиватель щелчков, как указано в ответах:

fun modifiedClick( onClick: (View) -> Unit): (View) -> Unit {
        return {
            //hide keyboard and invoke click only if there is a gap between frequent clicks
            hideKeyBoard(it)
            if (!isClickDisabled) {
                onClick(it)
            }
        }
    }

Теперь, если я назову это так, как показано ниже:

view.setOnClickListener {modifiedClick { login() }}

Это не вызовет login()

Но если я изменю преобразование SAM на обычное, как показано ниже:

view.setOnClickListener (modifiedClick { login() })

Это работает!

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

inline fun modifiedClick(crossline onClick: (View) -> Unit): (View) -> Unit {
            return {
                //hide keyboard and invoke click only if there is a gap between frequent clicks
                hideKeyBoard(it)
                if (!isClickDisabled) {
                    onClick(it)
                }
            }
        }

и вызову, как показано ниже:

view.setOnClickListener {modifiedClick { login() }}

Он даже не вызывает modifiedClick.

Изменение его на

view.setOnClickListener (modifiedClick { login() })

вызывает обе функции modifiedClick(), а затем login().

Может кто угоднопомогите мне понять, что происходит?

1 Ответ

0 голосов
/ 05 июня 2018
view.setOnClickListener {modifiedClick { login() }}

Здесь вы написали сокращение для этого (я перефразирую имена типов / функций):

view.setOnClickListener(object : OnClickListener() {
    override fun onClick(e: ClickEvent) {
        modifiedClick { login() }
    }
})

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

В противоположность этому, когда вы написали

view.setOnClickListener(modifiedClick { login() })

, вы просто вызвали modifiedClick { login() } и передали его возвращаемое значение setOnClickListener - это то, что вы хотели сделать.

...