2011-10-27 33 views
7

Phương thức toInt trong StringLike không nhận bất kỳ đối số nào và chỉ có thể phân tích cú pháp theo số thập phân. Vì vậy, để phân tích cú pháp nhị phân, hex vv, chúng ta cần phải sử dụng Java Integer#parseInt(String s, int radix).Quá tải phương thức `toInt` hiện tại

Trong một nỗ lực để khắc phục tình trạng này, tôi đã thử sau

implicit def strToToIntable(s: String) = new { 
    def toInt(n: Int) = Integer.parseInt(s, n) 
} 

Tuy nhiên,

"101".toInt(2) 

làm cho trình biên dịch REPL để "sụp đổ ngoạn mục" và không hoạt động trong biên soạn mã.

Có hạn chế về quá tải các phương pháp hiện có sử dụng mẫu "làm phong phú thư viện của tôi" không?

+1

Bạn có chắc chắn thẻ mới của mình, ["pimping"] (http://en.wikipedia.org/wiki/Pimping), là thích hợp không? – Blender

+5

+1 khi gặp sự cố REPL :-). –

+0

@Blender: cố định :) – tenshi

Trả lời

3

Không có ẩn, chạy "101".toInt(2) làm cho REPL cho tôi biết rằng Int không nhận tham số. Vì vậy, tôi đoán những gì đang xảy ra là nó đang chạy "101".toInt, sau đó cố gắng gọi apply(2) trên đó, điều này không có ý nghĩa. Tôi muốn đề nghị một sự đổi tên tinh tế của bạn toInt pimped để tránh vấn đề.

chỉnh sửa

Tôi chỉ có một số thành công của riêng tôi. Tôi rõ ràng định nghĩa một lớp chuỗi pimped như

class StrToRadixInt(s:String) { 
    def toInt(radix: Int) = Integer.parseInt(s,radix) 
} 

implicit def strToToIntable(s:String) = new StrToRadixInt(s) 

Và REPL là hạnh phúc:

scala> "101".toInt(2) 
res4: Int = 5 
+1

Nhưng sau đó bạn không thể gọi 'toInt' mà không có tham số ... –

+4

Dường như scala không muốn tạo điều kiện cho quá tải phương thức thông qua implicits: xem http://stackoverflow.com/questions/4480250/scala-pimp-my- thư viện với quá tải và http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on-int-via-implicit-conversions – Dylan

+0

Câu trả lời nằm trong các liên kết được cung cấp ở trên, vì vậy hãy chấp nhận câu trả lời này –

1

Các REPL không nên sụp đổ - đó là một lỗi. Nhưng ngay cả như vậy, quá tải tên được phần nào nản lòng và cũng không được hỗ trợ trong một số ngữ cảnh. Chỉ cần sử dụng một tên khác:

implicit def parseBase(s: String) = new { def base(b: Int) = Integer.parseInt(s,b) } 

scala> "10110" base 2 
res1: Int = 22 
Các vấn đề liên quan