Функция как параметр Kotlin - PullRequest
0 голосов
/ 11 мая 2019

Я хочу заменить некоторую часть строки другой строкой, найденной с помощью регулярных выражений.Для генерации замещающей строки мне нужно написать функцию.Ниже моя строка, в которой я хочу заменить "{#string}" на что-то еще.

var testString = "https://www.google.com/solution?region={america}&&country={usa}&&language={english}"

В целях тестирования я попробовал следующее, которое прекрасно работает:

testString = testString.replace(regex, "")

Но вместо "" я хотел бы иметь там блок или функцию, которая генерирует замещающую строку на основе ключей, т.е. региона, страны и языка, и возвращает ее.Ниже то, что я попробовал и ошибку, которую я получаю.Что мне не хватает синтаксически?

testString = testString.replace(regex, fun() : String {
    return ""
}) 

Ошибка:

enter image description here

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Подпись анонимной функции, которую вы передаете replace, неверна. Как говорится в сообщении об ошибке, функция должна иметь тип (MatchResult) -> CharSequence.

Это будет работать, поскольку String является подклассом CharSequence:

val result = "Some String".replace(Regex("[S]"), fun(mr: MatchResult) : String {
    return "s"
}) // result will be "some string"

Примечание: Вместо анонимной функции вы также можете использовать лямбду, которая может выводить параметр и возвращаемый тип:

val result = "Some String".replace(Regex("[S]")) {
    "s"
} 

MatchResult будет доступен как it тогда.

0 голосов
/ 11 мая 2019

Это должно работать:

string.replace(regex) { /*do your logic here*/ }

Вы также можете получить доступ к результату совпадения с помощью функции, и он должен возвратить CharSequence:

string.replace(regex) { matchResult -> "" }

Или ссылаться на объявленную функцию

string.replace(regex, ::doMagic)

fun doMagic(matchResult: MatchResult): CharSequence {
    /*
     *some cool stuff
     */
    return ""
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...