2015-01-07 13 views
5

Tôi đang cố gắng xuất một triển khai Scala của thuật toán để sử dụng trong JavaScript. Tôi đang sử dụng @JSExport. Thuật toán hoạt động với các giá trị Scala CharLong được đánh dấu là mờ đục trong interoperability guide.Làm việc với các loại mờ (Char và Long)

Tôi muốn biết (a) điều này có nghĩa là gì; và (b) những gì đề nghị là để đối phó với điều này.

tôi đoán nó có nghĩa là tôi nên tránh CharLong và làm việc với String cộng với một kiểm tra thời gian chạy trên chiều dài (hoặc có lẽ sử dụng một Sized bộ sưu tập hình thù) và Int để thay thế.

Nhưng các ý tưởng khác được chào đón.

Chi tiết ...

Các loại mã Tôi đang nhìn vào là:

@JSExport("Foo") 
class Foo(val x: Int) { 
    @JSExport("add") 
    def add(n: Int): Int = x+n 
} 

... mà hoạt động giống như mong đợi: new Foo(1).add(2) sản xuất 3.

Thay thế các loại bằng Long cùng một báo cáo cuộc gọi: java.lang.ClassCastException: 1 is not an instance of scala.scalajs.runtime.RuntimeLong (và điều gì đó tương tự với các phương pháp lấy và trả lại Char).

Trả lời

8

Là đục có nghĩa là

  • Không có Javascript loại tương ứng
  • Không có cách nào để tạo một giá trị của loại hình đó từ JavaScript (trừ nếu có một constructor @JSExport ed)
  • Không có cách nào để thao tác giá trị thuộc loại đó (ngoài gọi @JSExport phương thức và trường đã chỉnh sửa)

Vẫn có thể nhận được một giá trị của loại đó từ mã Scala.js, chuyển nó xung quanh và đưa nó trở lại mã Scala.js. Nó cũng luôn có thể gọi .toString(), bởi vì java.lang.Object.toString()@JSExport ed. Bên cạnh toString(), không phải Char cũng không xuất hiện Long xuất bất kỳ thứ gì, vì vậy bạn không thể làm gì khác với chúng.

Do đó, như bạn đã trải nghiệm, JavaScript 1 không thể được sử dụng làm Scala.js Long, vì nó không phải là loại phù hợp. Không phải là 'a' hợp lệ Char (nhưng đó là String hợp lệ).

Vì vậy, khi bạn đã suy ra, bạn thực sự phải tránh các loại mờ và sử dụng các loại khác thay thế nếu bạn cần tạo/thao tác chúng từ JavaScript. Phía Scala.js có thể chuyển đổi qua lại bằng các công cụ chuẩn trong ngôn ngữ, chẳng hạn như someChar.toIntsomeInt.toChar.

Lựa chọn loại nào là tốt nhất tùy thuộc vào ứng dụng của bạn. Đối với Char, có thể là Int hoặc String.Đối với Long, nó có thể là String, một cặp Int s hoặc thậm chí có thể là Double nếu các giá trị có thể không bao giờ sử dụng hơn 52 bit chính xác.

+0

Cảm ơn bạn - điều đó rất rõ ràng. –

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