2013-04-19 27 views
5

Trong Scala 2.10, có phải là someDouble.isNaN được mong đợi đóng hộp không? Chạy mã của tôi gọi .isNaN thông qua trình giải mã, tôi vẫn thấy các lệnh gọi đến số double2Double trong mã của tôi. Với mới AnyVal làm việc trong 2,10, tôi mong đợi nó sẽ không tồi tệ hơn java.lang.Double.isNaN(someDouble) khi chạy không có phân bổ giả. Tui bỏ lỡ điều gì vậy?Scala 2.10, Double.isNaN và boxing

Trả lời

6

Thật không may, isNaN là một phương pháp trên java.lang.Double, và nó là điều cần thiết để có một chuyển đổi ngầm để java.lang.Double, vì vậy lớp giá trị Scala RichDouble không thể reimplement isNaN để được nhanh chóng, và khi bạn sử dụng isNaN bạn hộp để java.lang.Double.

Vì đây lá chỉ cách chậm hoặc vụng về để kiểm tra NaN, tôi xác định

implicit class RicherDouble(val d: Double) extends AnyVal { 
    def nan = java.lang.Double.isNaN(d) 
} 

và sau đó tôi chỉ có thể sử dụng .nan để kiểm tra.

+0

Tại sao điều này có thể nhanh hơn đấm bốc đôi? – gzm0

+3

@ gzm0 - Bởi vì "hộp" này cho một lớp giá trị (đó là phần mở rộng AnyVal'), không thực sự được tạo trừ khi bạn cần truyền nó như một đối tượng hoặc chung hoặc đặt nó trong một mảng. Nếu bạn chỉ sử dụng nó (như bạn đang ở đây), Scala phát ra bytecode chỉ là một lời gọi phương thức, vì thực sự không có gì đòi hỏi một đối tượng thực sự tồn tại. –

+0

Không thể có mức độ ưu tiên cao hơn cho 'RicherDouble' của bạn, với cùng tên' isNaN' trên đó? Hoặc nếu không, một cái gì đó của cùng một ưu tiên thất bại với sự mơ hồ để nhắc nhở chính mình không sử dụng phương pháp đó trong vòng chặt chẽ. –

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