2012-03-13 30 views

Trả lời

30

Trước hết, new List() sẽ không hoạt động, vì lớp List là trừu tượng. Hai tùy chọn khác được quy định như sau trong the List object:

override def empty[A]: List[A] = Nil 
override def apply[A](xs: A*): List[A] = xs.toList 

Tức là, họ về cơ bản tương đương, do đó, nó chủ yếu là một vấn đề của phong cách. Tôi thích sử dụng empty vì tôi tìm thấy nó rõ ràng hơn và nó cắt giảm trên dấu ngoặc đơn.

12

Từ mã nguồn của List ta có:

object List extends SeqFactory[List] { 
    ... 
    override def empty[A]: List[A] = Nil 
    override def apply[A](xs: A*): List[A] = xs.toList 
    ... 
} 

case object Nil extends List[Nothing] {...} 

Vì vậy, chúng ta có thể thấy rằng nó là giống hệt nhau

Để hoàn chỉnh, bạn cũng có thể sử dụng Nil.

4

Đối với những sáng tạo của danh sách trống, như những người khác đã nói, bạn có thể sử dụng danh sách trông đẹp nhất cho bạn.

Tuy nhiên đối với mô hình kết hợp với một danh sách rỗng, bạn có thể chỉ sử dụng Nil

scala> List() 
res1: List[Nothing] = List() 

scala> res1 match { 
    | case Nil => "empty" 
    | case head::_ => "head is " + head 
    | } 
res2: java.lang.String = empty 

EDIT: Correction: case List() làm việc quá, nhưng case List.empty không biên dịch

Các vấn đề liên quan