В Scala есть ли вообще разница между Nil
и List()
?
Если нет, то какой из них более идиоматический стиль Scala? Как для создания новых пустых списков, так и для сопоставления с образцом в пустых списках.
scala> println (Nil == List())
true
scala> println (Nil eq List())
true
scala> println (Nil equals List())
true
scala> System.identityHashCode(Nil)
374527572
scala> System.identityHashCode(List())
374527572
Nil более идиоматичен и в большинстве случаев может быть предпочтительнее. Вопросы?
Nil
это более идиоматично.List[A]()
(неNil
) необходимо использовать значение аккумулятора для foldLeft? Пример -scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
использованиеNil
в качестве аккумулятора здесь не сработает.Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
Пользователь unknown показал, что значения времени выполнения для обоих
Nil
иList()
одинаковы. Однако их статический тип не является:Это особенно важно, когда оно используется для вывода типа, например, в аккумуляторе свертки:
источник
y :: x
делает работу. Проблема в том, что возвращаемый тип не является ожидаемым. Он возвращаетсяList[Int]
, в то время как ожидаемый тип -List[Nothing]
илиNil.type
(я думаю, первое, но, возможно, второе).Как показывает ответ пользователя unknown, это один и тот же объект.
Идиоматически следует предпочесть Nil, потому что он красивый и короткий. Однако есть исключение: если явный тип необходим по какой-то причине, я думаю
лучше чем
источник
List.empty[Foo]
третья альтернатива.