Vì scala.runtime.RichString được khai báo là cuối cùng, bạn không thể mở rộng nó như class MyString extends RichString
. Tôi muốn 'pimp thư viện' và chỉ cần thêm một phương thức khác. Làm thế nào tôi sẽ làm điều này?Có cách nào để mở rộng RichString của Scala không?
Trả lời
Vì quy tắc quan trọng của hàm ý là chỉ có một quy tắc được áp dụng để thực hiện kiểm tra kiểu biểu thức (phụ), pimping RichString
để bổ sung thêm vào các phương thức mà nó thêm vào String
sẽ không cho phép bạn xem các phương thức của lớp RicherString
(nếu bạn muốn) như thể chúng có sẵn trực tiếp trên các cá thể String. Họ sẽ có sẵn nếu bạn có một RichString
, tất nhiên, và RichString
trường hợp là tầm thường có sẵn từ String
trường hợp bằng cách đơn giản loại ascription. Nhưng vẫn còn, nó không phải là những gì mọi người sẽ gọi thuận tiện.
Vì vậy, cho mục đích thực tế, những gì bạn đang yêu cầu không thực sự có thể có trong Scala.
Mặt khác, nếu bạn chỉ cần thay thế tăng thêm String
, bạn chỉ có thể xác định lớp chuỗi tăng cường của riêng bạn. Nếu không có sự chồng chéo giữa các phương thức nó định nghĩa và các phương thức được định nghĩa trong RichString, sẽ không bao giờ có bất kỳ sự mơ hồ nào đối với trình biên dịch để giải quyết trong quyết định áp dụng. Đó có lẽ là đủ tốt, phải không?
Ngoài ra, cách tiếp cận này (một chuyển đổi tiềm ẩn thay thế, không trùng lặp) sẽ không bị ngắt khi bạn chuyển sang Scala 2.8, có StringOps
thay cho RichString
.
Để làm điều này, bạn sẽ làm điều gì đó tương tự như sau:
class MyRichString(underlying:String){
def myNewMethod = { ... }
}
implicit def addMyMethods(s:String)=new MyRichString(s)
Awesome, thực hiện chính xác những gì tôi muốn. Cảm ơn. – pr1001
Trên thực tế, mô hình đó phổ biến đến nỗi [các lớp ẩn] (http://docs.scala-lang.org/overviews/core/implicit-classes.html) được đưa vào như là chính thức. – jeslg