2013-07-12 29 views
5

Ví dụ này:Tại sao các đặc điểm của Scala thực hiện từ phải sang trái?

val queue = new BasicIntQueue with Doubling with Incrementing with Filtering 
queue.put(1) 
println(queue.get()) 

sẽ in:

Filtering 
Incrementing 
Doubling 
put 
4 

Như đối với tôi nó sẽ dễ đọc hơn nếu nó được thực hiện từ trái sang phải, theo thứ tự tôi đã viết hoạt động.

+2

Tôi không khủng khiếp quen thuộc với Scala, nhưng tôi đoán như thế nào mà mã được phân tích cú pháp. Vì vậy, nó là '(((mới BasicIntQueue với tăng gấp đôi) với gia tăng) với lọc)', và các biểu thức như thế được đánh giá trong cùng-paren-đầu tiên. – millimoose

+0

Có, xem [this] (http://stackoverflow.com/questions/7230808/inheriting-a-trait-twice) –

Trả lời

6

Đừng nghĩ 'thực thi', bởi vì nó không ... nghĩ 'phân lớp': nếu bạn thêm một số khác with XYZ ở bên phải, bạn đã thêm một lớp khác lên trên.

0

Để giải quyết vấn đề kim cương của nhiều inharitance

6

Bởi vì nó đi theo cùng một khuôn mẫu như thừa kế. Hãy tưởng tượng rằng bạn đã có một cái gì đó như thế này:

class BasicIntQueue 
class Doubling extends BasicIntQueue 
class Incrementing extends Doubling 
class Filtering extends Incrementing 

val queue = new Filtering 

Bạn sẽ nhận được kết quả tương tự như bạn đã thấy: Filtering được thực hiện trước, sau đó truyền lại cho Incrementing, sau đó Doubling và cuối cùng BasicIntQueue.

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