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)
- 1. Lớp Scala có thể mở rộng nhiều lớp không?
- 2. Làm cách nào để mở rộng scala.swing?
- 3. Mở rộng lớp Java với Scala Trait
- 4. Scala, mở rộng trình lặp số
- 5. Có cách nào để mở rộng hành vi INameFromTitle của Plone Dexterity không?
- 6. Mở rộng bộ sưu tập Scala
- 7. Tôi làm cách nào để mở rộng nền của nút?
- 8. Làm cách nào để mở rộng ứng dụng Scala REST sử dụng Akka?
- 9. Làm cách nào để mở rộng NSArray?
- 10. Làm cách nào để mở rộng Array.prototype.push()?
- 11. Android làm cách nào để mở tệp mở rộng .doc?
- 12. Trong C hoặc C++, có cách nào để mở rộng một lớp không thừa kế không?
- 13. Làm cách nào để lấy tên của đối tượng Tệp mà không có phần mở rộng của nó trong Java?
- 14. Làm cách nào để kiểm soát người dùng mở rộng lớp mở rộng UserControl?
- 15. Làm cách nào để bạn có thể mở rộng hành vi mặc định của Tridion.Cme.Commands.Open.prototype._execute()?
- 16. Scala Mở rộng Lớp Tóm tắt Tham số
- 17. Làm cách nào để mở rộng lớp AS3 đúng cách?
- 18. Mũi có phải là phần mở rộng của unittest không?
- 19. Có cách nào để làm cho một TreeView xuất hiện luôn mở rộng hoàn toàn không?
- 20. Có cách nào để thực hiện div vị trí hoàn toàn mở rộng vùng chứa không?
- 21. Làm cách nào để tôi mở rộng Lớp học khi có thể mở rộng một lớp khác?
- 22. Có cách nào để lấy từ trong menu ngữ cảnh trong phần mở rộng firefox không?
- 23. Làm cách nào để mở tệp có chương trình được liên kết với phần mở rộng của tệp?
- 24. Có cách nào tốt hơn để kiểm tra nút JTree được mở rộng hay không?
- 25. Có cách nào để viết Phương thức mở rộng áp dụng cho nhiều loại không?
- 26. Có cách nào để mở rộng thư mục JFileChooser mà không cần chuột
- 27. Có thể mở rộng Java Enums không?
- 28. Làm cách nào để tạo GridView có thể kéo giãn trong Android để mở rộng chiều rộng Cột thành bất kỳ phần mở rộng nào?
- 29. Có phải `mở rộng` nhanh hơn` + = `không?
- 30. Làm thế nào để mở rộng lớp BaseDaoImpl của ORMLite trên Android để mở rộng chức năng
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