Любое соглашение для "дали пустой список вернуть пустой список" при сопоставлении шаблонов?
Когда шаблон соответствует списку, кажется обычным возвращать пустой список, когда ему дан пустой список. Мы можем сопоставить пустой список с Nil
или же List()
, но мы можем вернуть пустой как Nil
, List()
или возвращая данный аргумент списка.
Что здесь за соглашение? Когда бы вы выбрали один метод по сравнению с другим?
Примеры:
def givenEmptyNumsReturnsNil(nums: List[Int]): List[Int] = nums match {
case List() => Nil
case x :: xs => ???
}
def givenEmptyNumsReturnsEmptyList(nums: List[Int]): List[Int] = nums match {
case List() => List()
case x :: xs => ???
}
def givenEmptyNumsReturnsNums(nums: List[Int]): List[Int] = nums match {
case List() => nums
case x :: xs => ???
}
2 ответа
Для выбора лучшего способа просто уточните, что внутри:
дело N1:
def givenEmptyNumsReturnsEmptyList(nums: List[Int]): List[Int] = nums match {
case List() => List()
case x :: xs => ???
}
Позвоню unaplay
метод из объекта List
, после позвоним apply
метод объекта List
,
дело N2:
def givenEmptyNumsReturnsNil(nums: List[Int]): List[Int] = nums match {
case Nil => Nil
case x :: xs => ???
}
Будет сравнивать значение перед совпадением с объектом Nil
и вернет объект Nil
И в случае выбора я предпочитаю случай N2, потому что он немного оптимален.
Я новичок в скале и не знаю каких-либо существующих соглашений об этом. Мои вещи об этом:
- Последний не интуитивно понятен
- Я предпочитаю возвращение, которое мне подходит. Если у меня есть дело List(), я возвращаю List().
- Вы также можете сопоставить ноль:
-
def givenEmptyNumsReturnsNil(nums: List[Int]): List[Int] = nums match {
case Nil => Nil
case x :: xs => ???
}
Но Nil и List () одинаковы.