Есть ли возможность сделать функцию try catch как инфиксную? - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь создать инфиксную функцию для своего проекта, чтобы проверить результат функции try catch.

Я видел решение, но передаю блок в качестве параметра и запускаю этот блок внутри tryOrNull работает вот так.

fun <T : Any> tryOrNull(body: () -> T?): T? {
//the body returns T? so that you can give up the work by returning null
return try {
body()
} catch (e: Exception) {
e.printStackTrace()
null
}

}

и используя вот так

fun parse(): MyData? {
return tryOrNull { parse1() }
?: tryOrNull { parse2() }
?: tryOrNull { parse3() }

}

эту информацию я видел здесь

Но я хотел бы знать, есть ли другой способ сделать что-то вроде этого

fun parse(): MyData? {
return parse().tryOrNull() ?: false
}

Я хотел бы создать инфиксную или расширенную функцию, но я не знаю, как управлять вообще. Спасибо!.

1 Ответ

1 голос
/ 17 июня 2020

Предложенный вами синтаксис (parse().tryOrNull()) будет невозможен, потому что parse() будет вызван и вернет результат до того, как достигнет tryOrNull().

Однако,

::parse.tryOrNull()

или

{ parse() }.tryOrNull()

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

inline fun <T> (() -> T).tryOrNull(): T? = runCatching(this)
    .also { it.exceptionOrNull()?.printStackTrace() }
    .getOrNull()

Но я думаю исходный синтаксис, который вы показали, более ясен. Имеет больше смысла semanti c видеть то, что вы вызываете, завернутым в вызов tryOrNull вместо того, чтобы прикреплять tryOrNull как запоздалую мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...