Nếu tôi có lớp học giá trị này:Trong những trường hợp này, lớp giá trị Scala sẽ được "đóng hộp", phải không?
class ActionId(val value: Int) extends AnyVal
Sau đó, trong tất cả các ví dụ dưới đây, một đối tượng sẽ được phân bổ cho các lớp giá trị? (Nó sẽ được "đóng hộp" - nó sẽ không chỉ đơn giản là được tháo để một đồng bằng bit số nguyên 32, phải không?)
Một hàm trả về một giá trị lớp - lớp giá trị thoát phạm vi và sẽ do đó được "đóng hộp"?
def someFunction(): ActionId = { ... return ActionId(123) }
Một hàm trả về một đối tượng với một thành viên lớp giá trị - lớp giá trị thoát phạm vi và sẽ do đó được "đóng hộp"?
case class Post(id: ActionId, ...) { ... } def someFunction(): Post = { ... val somePost = Post(ActionId(123), ...) // ActionId will be "boxed", right? return somePost }
Thậm chí nếu đối tượng với một thành viên lớp giá trị là không trả lại (không thực sự thoát khỏi phạm vi), lớp giá trị vẫn sẽ được "đóng hộp", khi nó được sử dụng như một thành viên của một lớp khác (như một trường trong lớp
Post
, trong ví dụ này)?def anotherFunction() { ... val somePost = Post(ActionId(123), ...) // "Boxed" here too, right? // ... do something with somePost // But don't: return somePost // However some *other* similar functions *do* return `somePost` — so // class `Post` must be able to box the ActionId? Hence it's boxed (above)? }
Về vấn đề này là this answer, mà nói rằng khi lớp giá trị không thoát khỏi phạm vi, nó có hiệu quả được inlined. Nó đề cập đến tài liệu quy trình cải tiến Scala SIP-15 để biết thêm chi tiết. Tuy nhiên như xa như tôi có thể nói SIP-15 thực sự không đề cập đến một ví dụ lớp giá trị mà thoát khỏi phạm vi sẽ được "đóng hộp". Nhưng tôi nghĩ có vẻ hợp lý rằng nó sẽ phải "đóng hộp". (Tại sao SIP không nêu rõ rằng nó sẽ được đóng hộp nếu nó thoát?)
Bạn có thể tưởng tượng hỗ trợ thư viện để giảm thiểu chi phí cú pháp khi giao dịch với mảng không? – ziggystar
@ziggystar - Vâng, ngay bây giờ mọi thứ làm giảm chi phí cú pháp làm tăng chi phí đầu vào bytecode. Vì vậy, đó là một trò chơi khó chơi. Khi nó quan trọng, bạn có thể có một lớp giá trị kết thúc tốt đẹp mảng và thực hiện công việc cho bạn (với rất ít cú pháp cú pháp), nhưng tôi không chắc chắn về cách tạo ra một nhà máy tầm thường cho một lớp giá trị tạo ra mảng tương ứng lớp giá trị. Macros cuối cùng sẽ đến đó, tôi cho là vậy. –
@RexKerr vậy điều này có nghĩa là không có lớp giá trị bên trong cấu trúc dữ liệu? Nói cách khác, Danh sách, Bản đồ, v.v. sẽ luôn khởi tạo lớp được đóng hộp? –