Объединить множественное число в котлин - PullRequest
0 голосов
/ 16 ноября 2018

Предположим, у меня есть следующее:

fun makeSound(val animal: Animal) = when(animal) {
  is Lion -> animal.roar()
  is TRex -> animal.roar()
  is Cow -> animal.moo()
}

Обычно я бы упростил это, просто добавив интерфейс RoaringAnimal и запросив is RoaringAnimal.Но есть ли другой способ объединения нескольких is предложений в одно?

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Обычно вы можете комбинировать пункты, как показано в ответе Йони.

Но в конкретном случае, который roar определен для Lion и TRex, но не для Animal, вы не можете.

Это потому, что компилятор вставляет умное приведение:

is Lion -> animal.roar()

действительно

is Lion -> (animal as Lion).roar()

, но в предложении is Lion, is TRex -> он не будет знать, что такое приведение

В принципе, компилятор может быть расширен для обработки таких случаев, вставив еще один when:

is Lion, is TRex -> animal.roar()

, ставший

is Lion, is TRex -> when(animal) {
    is Lion -> animal.roar() // works as before
    is TRex -> animal.roar()
}

, но я бы не сталне ожидаю, что это произойдет

0 голосов
/ 16 ноября 2018

То, что вы здесь делаете, для меня похоже на кодовый запах . Почему вы не используете полиморфизм для этого типа проблемы?

interface Animal {
    fun makeSound()
}
class Lion : Animal {
    override fun makeSound() { println("roar") }
}
class Trex : Animal {
    override fun makeSound() { println("ROAAAARRRR") }
}
class Cow : Animal {
    override fun makeSound() { println("moo") }
}

fun makeSound(animal: Animal) {
    animal.makeSound()
    // due tue "late binding", this will automatically call the correct method - no need to check what kind of animal it is! 
}
0 голосов
/ 16 ноября 2018

ОБНОВЛЕНИЕ : ответ ниже был написан до того, как в вопросе было указано, что roar - это метод для параметра animal. Теперь, когда вопрос стоит, ответ ниже не будет работать, однако он по-прежнему показывает, как несколько условий можно объединить в одной строке в выражении when.

Вы можете объединить их:

fun makeSound(animal: Animal) = when(animal) {
  is Lion, is TRex -> roar()
  is Cow -> moo()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...