6

Tôi đang đánh giá Scala và đang gặp vấn đề với các bộ sưu tập không thể thay đổi của nó.Cách tạo các bộ sưu tập bất biến của Scala giữ các vật thể bất biến

Tôi muốn tạo các bộ sưu tập bất biến, hoàn toàn không thay đổi được, phải qua tất cả các đối tượng chứa, đối tượng mà chúng tham chiếu, quảng cáo vô hạn.

Có cách nào đơn giản để thực hiện việc này không?

Mã trên http://www.finalcog.com/immutable-containers-scala minh họa những gì tôi đang cố gắng đạt được và một công việc khó chịu xung quanh (ImmutablePoint).

Sự cố với giải pháp thay thế là mỗi lần tôi muốn thay đổi đối tượng, tôi phải tạo bản sao mới theo cách thủ công. Tôi hiểu rằng thời gian chạy sẽ phải thực hiện copy-on-write, nhưng điều này có thể được thực hiện trong suốt đối với nhà phát triển không?

Tôi cho rằng tôi đang tìm cách tạo các đối tượng bất biến, nơi mà các phương thức thay đổi trạng thái đối tượng hiện tại, nhưng tất cả các tham chiếu 'val' khác (và tất cả không thay đổi) đối tượng vẫn giữ trạng thái 'cũ'.

+0

Bài báo này có thể bạn quan tâm: http://lamp.epfl.ch/~phaller/capabilities.html –

+0

Tài liệu đọc tuyệt vời, cảm ơn. – fadedbee

Trả lời

9

Điều này không thể xảy ra với scala thông qua một số ngôn ngữ cụ thể, trừ khi bạn đã tuân theo thành ngữ tất cả đối tượng của bạn là không thay đổi, trong trường hợp này, hành vi này miễn phí!

Với 2,8, các tham số được đặt tên đã làm cho "các nhà xây dựng sao chép" khá tốt đẹp để sử dụng, từ một góc độ dễ đọc. Nhưng bạn là chính xác, điều này hoạt động như copy-on-write. Hành vi mà bạn đang yêu cầu, nơi đối tượng "hiện tại" là đối tượng duy nhất bị đột biến hoàn toàn ngược lại với cách mà JVM hoạt động, rất tiếc (đối với bạn)!

Thực tế cụm từ "đối tượng hiện tại" không có ý nghĩa; thực sự bạn có nghĩa là "hiện tại tham chiếu"! Tất cả các tham chiếu khác (ngoài phạm vi từ vựng hiện tại) trỏ đến cùng một đối tượng, erm, trỏ đến cùng một đối tượng! Chỉ có một đối tượng!

Do đó nó chỉ là không thể cho đối tượng này xuất hiện là có thể thay đổi từ quan điểm của phạm vi từ vựng hiện tại nhưng không thể thay đổi cho người khác

+0

Cảm ơn câu trả lời của bạn. Có, tôi có nghĩa là tham chiếu hiện tại. Tôi nghĩ rằng tôi là một chút len ​​trên những gì tôi có ý nghĩa của đối tượng. Nếu tôi đang trừu tượng hóa một hệ thống kế toán, ví dụ, một đối tượng đại diện cho một tài khoản là một đối tượng duy nhất. Tuy nhiên, đối tượng có thể đã trải qua nhiều trạng thái. Tôi muốn các thùng chứa bất biến để tham chiếu đối tượng trong 'trạng thái' mà nó tồn tại tại thời điểm nó được đưa vào thùng chứa. Trong cách giải quyết của tôi (chỉ sử dụng các đối tượng không thay đổi) tài khoản sẽ được đại diện bởi một loạt các đối tượng chia sẻ một trường account_id chung. – fadedbee

+0

Trong kết luận, có vẻ như tôi sẽ phải sử dụng các vật thể bất biến tất cả các con đường xuống. Cảm ơn vì đã dành thời gian cho tôi. – fadedbee

2

Nếu bạn quan tâm đến một số lý thuyết tổng quát hơn về cách xử lý thông tin cập nhật đến bất biến cấu trúc dữ liệu hiệu quả,

http://en.wikipedia.org/wiki/Zipper_%28data_structure%29

có thể chứng minh điều thú vị.

+0

Cảm ơn, điều đó thật thú vị.Có lẽ tôi có thể đi mà không có nạng bắt buộc ... – fadedbee