Любое соглашение для "дали пустой список вернуть пустой список" при сопоставлении шаблонов?

Когда шаблон соответствует списку, кажется обычным возвращать пустой список, когда ему дан пустой список. Мы можем сопоставить пустой список с 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 () одинаковы.

Другие вопросы по тегам