Отменить возвращаемое значение для возврата Unit?

Я только начинаю с kotlin, поэтому, простите меня, если это основной вопрос, я действительно сделал какой-то поиск в Интернете, но это ничего не помогло.

Вопрос в том, как преобразовать значение в Unit . Например, в scala, если я пишу что-то вроде этого:

 def foo: Int = ??? def bar(x: String): Unit = x match { case "error" => println("There was an error") case _ => foo 

}

Тип возврата выражения соответствия – Any , но он отбрасывается компилятором, и функция возвращается функцией.

Но делать что-то подобное в котлине:

 fun bar(x: String): Unit = when(x) { "error" -> println("There was an error") else -> foo() } 

он жалуется на часть foo : inferred type is Int but Unit was expected

Я знаю, что в этом случае я могу просто избавиться от = , и вместо этого поместить тело внутри блока, это работает, но я ищу общее решение. То, к чему я смог прийти, – это просто foo.let {} , но это кажется довольно неуклюжим, особенно если таких случаев много, когда это нужно сделать.

Вы можете создать метод расширения для любого объекта и вызвать его . Я просто предпочитаю использовать имя discard() а не toUnit() , поскольку я чувствую, что он лучше передает намерение:

 fun Any?.discard() = Unit fun foo(): Int = 3 fun bar(x: String): Unit = when (x) { "error" -> println("There was an error") else -> foo().discard() } 

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

 fun Any?.unit() = Unit 

Затем используйте его как:

 fun bar(x: String): Unit = when(x) { "error" -> println("There was an error") else -> foo().unit() } 

В качестве альтернативы, сделайте, when оператор, а не выражение:

 fun bar(x: String) { when(x) { "error" -> println("There was an error") else -> foo() } } 

По моему мнению, есть три решения вашей проблемы:

  1. Сделать, when выражение вместо выражения:

     fun bar(x: String) { when(x) { "error" -> println("There was an error") else -> foo() } } 
  2. Используйте расширение для преобразования значений в Unit :

     fun Any?.asUnit() = Unit 

    Применение:

     fun bar(x: String): Unit = when (x) { "error" -> println("There was an error") else -> foo().asUnit() } 
  3. Включите функцию более высокого порядка, которая возвращает Unit , например, with

     fun bar(x: String): Unit = with(x){ when (x) { "error" -> println("There was an error") else -> foo() } }