2012-06-30 34 views
8

Tôi nghĩ rằng tôi hiểu được mới "class giá trị" tính năng của Scala 2.10, bằng cách so sánh với newtype Haskell của:Các lớp giá trị do người dùng định nghĩa trông như thế nào từ Java?

trait BoundedValue[+This] extends Any { this: This => 

    def upperBound: This 

    def lowerBound: This 

} 

class Probability @throws(classOf[IllegalArgumentException]) (v: Double) extends AnyVal with BoundedValue[Probability] { 

    val value: Double = if ((v >= 0.0) && (v <= 1.0)) v else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]") 

    override val upperBound: Probability = new Probability(0.0) 

    override val lowerBound: Probability = new Probability(1.0) 

    // Implement probability arithmetic here; 
    // will be represented by Double at runtime. 

} 

Các câu hỏi tôi có được, làm thế nào để một lớp giá trị dường như mã Java có sử dụng gói Scala trong đó nó được khai báo? Lớp giá trị có xuất hiện như một lớp tham chiếu từ phía Java hay nó bị xóa hoàn toàn (và do đó xuất hiện như kiểu nó kết thúc tốt đẹp)? Nói cách khác, cách an toàn kiểu là các lớp giá trị khi Java có liên quan đến cấp nguồn?


EDIT

Đoạn mã trên sẽ không biên dịch, theo SIP-15 tài liệu (liên kết trong câu trả lời của Daniel), bởi vì các lớp học giá trị không được phép có bất cứ logic khởi, bởi vì hoặc v phải rõ ràng là val hoặc Probability phải có phương thức unbox và phương thức box tương ứng trên đối tượng đồng hành của nó và vì các lớp giá trị phải có chính xác một trường. Mã đúng là:

trait BoundedValue[This <: BoundedValue[This]] extends Any { this: This => 

    def upperBound: This 

    def lowerBound: This 

} 

class Probability private[Probability] (value: Double) extends AnyVal with BoundedValue[Probability] { 

    @inline override def upperBound: Probability = new Probability(0.0) 

    @inline override def lowerBound: Probability = new Probability(1.0) 

    @inline def unbox: Double = value 

    // Implement probability arithmetic here; 
    // will be represented by Double at runtime (mostly). 

} 

object Probability { 

    @throws(classOf[IllegalArgumentException]) 
    def box(v: Double): Probability = if ((v >= 0.0) && (v <= 1.0)) new Probability(v) else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]") 

} 

Bản thân câu hỏi vẫn hợp lệ.

+1

Trong chương trình thử nghiệm của bạn, bạn có thể đẩy giá trị được bọc bên ngoài giới hạn hợp lệ từ Java không? –

+0

@DavidHarkness Tôi không có quyền truy cập vào máy có 2.10.0-M4 trên máy tính ngay bây giờ, vì vậy tôi không biết. Tôi sẽ kiểm tra khi nào có thể. –

Trả lời

6

Lớp giá trị biên dịch thành các lớp bình thường và cũng có thể xuất hiện dưới dạng tham chiếu.

Phép thuật trong đó là, khi lớp giá trị không thoát khỏi phạm vi, tất cả dấu vết của nó đều bị xóa khỏi mã, có hiệu quả nội tuyến tất cả mã. Và, tất nhiên, cho an toàn loại bổ sung.

Xem thêm SIP-15, giải thích về cơ học.

+0

Cảm ơn bạn! Tôi nghĩ rằng tôi đã đọc SIP, nhưng tôi đoán tôi đã không. –

+2

Một câu hỏi thú vị không kém là "kiểu giá trị Scala được mã hóa trên nền tảng không có loại giá trị như thế nào (ví dụ JVM)" là "kiểu giá trị Scala được mã hóa trên nền tảng * có * có các loại giá trị (ví dụ: CLI) ". Ví dụ, có thể loại giá trị Scala bằng cách biên dịch thành cấu trúc trên CLI? Có đảm bảo rằng họ sẽ * luôn luôn * được biên dịch cho các cấu trúc không? –

+1

Câu hỏi của bạn rất thú vị, nhưng tôi nhận ra rằng không chỉ cấu trúc CLI không được hỗ trợ (chúng không được đề cập trong SIP, lần cuối tôi đọc nó), nhưng chúng có lẽ cũng vô ích. Các lớp giá trị chỉ có thể có một trường duy nhất, như kiểu mới của Haskell, do đó tôi nghĩ rằng việc sử dụng các cấu trúc và không phải các kiểu nguyên thủy sẽ không giúp ích gì. Các cấu trúc có rất nhiều lợi thế cho việc sử dụng bộ nhớ — nhưng để sử dụng chúng, bạn nên cung cấp một cơ chế riêng biệt, đó là chú thích yêu cầu hành vi này có thể bỏ qua. Vấn đề ngữ nghĩa là các cấu trúc có lẽ nên kế thừa từ AnyVal chỉ trên CLI, chứ không phải trên JVM. – Blaisorblade

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