2011-07-20 26 views
29

tôi thấy ví dụ đơn giản:Scala với việc sử dụng từ khóa

class Post extends LongKeyedMapper[Post] with IdPK { 
    def getSingleton = Post 

    object title extends MappedText(this) 
    object text extends MappedText(this) 
    object date extends MappedDate(this) 
} 


object Post extends Post with LongKeyedMetaMapper[Post] { 
    def getPosts(startAt: Int, count: Int) = { 
     Post.findAll(OrderBy(Post.date, Descending), StartAt(startAt), MaxRows(count)) 
    } 

    def getPostsCount = Post.count 
} 

có nghĩa là gì with IdPK?

Cảm ơn.

Trả lời

37

with có nghĩa là lớp học đang sử dụng Trait qua mixin.

Post có Trait IdPK (tương tự như lớp Java có thể implements Giao diện).

Xem thêm A Tour of Scala: Mixin Class Composition

+0

Cảm ơn, tôi đã quên các đặc điểm trong scala. –

+0

Động từ UML cho mối quan hệ "có" là gì? "có", "bao gồm" ... – Ricardo

8

Trong khi đây không phải là một câu trả lời trực tiếp cho câu hỏi ban đầu, nó có thể hữu ích cho độc giả trong tương lai. Từ Wikipedia:

Scala cho phép kết hợp trong một đặc điểm (tạo kiểu ẩn danh) khi tạo phiên bản mới của lớp.

Điều này có nghĩa là with có thể sử dụng bên ngoài dòng trên cùng của định nghĩa lớp. Ví dụ:

trait Swim { 
    def swim = println("Swimming!") 
} 

class Person 

val p1 = new Person // A Person who can't swim 
val p2 = new Person with Swim // A Person who can swim 

p2 đây có phương pháp swim sẵn cho nó, trong khi p1 không. Các thực loại p2 là một "ẩn danh", cụ thể là Person with Swim. Trong thực tế, with cú pháp có thể được sử dụng trong bất kỳ loại chữ ký:

def swimThemAll(ps: Seq[Person with Swim]): Unit = { 
    ps.foreach(_.swim) 
} 

EDIT (2016 12 tháng 10): Chúng tôi đã phát hiện ra một điều không minh bạch. Phần sau sẽ không biên dịch:

// each `x` has no swim method 
def swim(xs: Seq[_ >: Person with Swim]): Unit = { 
    xs.foreach(_.swim) 
} 

Có nghĩa là về ưu tiên từ vựng, with liên kết háo hức. Đó là _ >: (Person with Swim), không phải (_ >: Person) with Swim.

+0

hey @fosskers, tôi đang tìm câu trả lời trực tuyến nhưng không tìm được câu trả lời, và trong tìm kiếm của tôi, tôi đã kết thúc ở đây - nếu tôi có 'Seq [_>: Person with Swim] ', điều này có nghĩa là" bất kỳ loại siêu kiểu nào "Người có Swim'" hay "bất kỳ siêu kiểu nào của kiểu' Person', với 'Swim' được trộn lẫn trong"? Thành thật mà nói, không có ý nghĩa quá nhiều và tôi không bao giờ có nhu cầu sử dụng nó, nhưng tôi tìm thấy nó trong mã khác. – slouc

+0

@slouc Tôi đã cập nhật bài đăng của mình để phản ánh những phát hiện của mình. –

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