Tôi đang cố gắng triển khai (de) tuần tự hóa từ các trường hợp Scala sang Maps (field_name -> field_value). Vấn đề là tôi không biết làm thế nào để tạo ra một chức năng, mà sẽ có một loại lớp trường hợp và một bản đồ, khởi tạo, cư và trả lại nó. Tôi đã thấy điều này được thực hiện trong một số thư viện JSON, nhưng tôi không nhận được mã.trường hợp lớp học từ Bản đồ
7
A
Trả lời
3
Việc làm này cho một trường hợp lớp học đặc biệt là tầm thường:
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class Foo(x: Int, y: Double, z: String) {
def toMap = Map('x -> x, 'y -> y, 'z -> z)
}
object Foo {
def apply(vals: Map[Symbol, Any]): Foo = Foo(vals('x).asInstanceOf[Int], vals('y).asInstanceOf[Double], vals('z).asInstanceOf[String])
}
// Exiting paste mode, now interpreting.
defined class Foo
defined module Foo
scala> Foo(Map('x -> 1, 'y -> 2.0, 'z -> "wibble"))
res0: Foo = Foo(1,2.0,wibble)
scala> res0.toMap
res1: scala.collection.immutable.Map[Symbol,Any] = Map('x -> 1, 'y -> 2.0, 'z -> wibble)
Nhưng tôi đoán rằng bạn muốn tạo một cái gì đó mà làm việc cho bất kỳ lớp trường hợp, nơi bạn không nhất thiết phải biết những gì tên của các giá trị là gì?
Trong trường hợp đó, bạn sẽ phải có một cái nhìn tại phản ánh (thêm vào trong Scala 2.10.0):
http://docs.scala-lang.org/overviews/reflection/overview.html
Bạn có thể sử dụng phản ánh để lặp qua các thành viên của một lớp , tìm hiểu tên của họ là gì và sau đó tạo bản đồ của bạn. Ví dụ:
scala> import reflect.runtime.universe._
import reflect.runtime.universe._
scala> typeOf[Foo].members filter { m => m.isMethod && m.asMethod.isStable }
res2: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(value z, value y, value x)
Các vấn đề liên quan
- 1. Số bản đồ toán học
- 2. hashCode trong trường hợp các lớp học trong Scala
- 3. Sử dụng trường hợp cho các lớp học chính thức
- 4. Getters/setters của một lớp học có bản đồ
- 5. Làm thế nào để serialize/deserialize trường hợp lớp học đến/từ Json trong Play 2.1
- 6. trường hợp của lớp Class
- 7. Truy cập tên trường bản đồ kết hợp tăng cường
- 8. Học thuyết tùy chọn Bản đồ OneToOne
- 9. Lớp học kiểu cũ, lớp học kiểu mới và metaclasses
- 10. Bản đồ khoa học bằng Python
- 11. Tạo loại hỗn hợp từ hai lớp enum, sẵn sàng cho bản đồ STL
- 12. Scala: Kết hợp các lớp trường hợp
- 13. Cách tạo lớp proxy từ WSDL trong trường hợp webservice
- 14. Đối sánh nhiều trường hợp với các lớp học trong scala
- 15. C++ uninitialized mảng của trường hợp lớp
- 16. 'bản sao' cho các trường hợp không phải là trường hợp?
- 17. Làm thế nào tôi có thể deserialize từ JSON với Scala sử dụng * không trường hợp * lớp học?
- 18. lớp phủ bản đồ google
- 19. Java: Lớp học trả về (Không phải là một trường hợp)
- 20. Các lớp học kế thừa từ lớp trừu tượng
- 21. Lớp học giống như lớp
- 22. Hợp nhất hai Bản đồ
- 23. Scala: Bỏ qua trường lớp trường hợp cho bằng/hascode?
- 24. Công cụ để kết hợp các lớp học một phần thành một lớp học?
- 25. Sự khác biệt giữa hai trường hợp cùng một lớp
- 26. In biểu đồ lớp học theo lập trình
- 27. Đóng hoạt động từ một lớp học khác
- 28. Tôi có thể lấy định nghĩa lớp trường hợp Scala từ định nghĩa lược đồ Avro không?
- 29. Từ khoá "siêu" trong phương thức lớp học
- 30. java.lang.NoClassDefFoundError từ mọi lớp học mỗi ngày
Còn về hướng khác, 'Map (fieldName -> fieldValue)' đối với lớp chữ thường? –
Bạn muốn tạo một trường hợp mới có các thành viên với tên của các phím của bản đồ? Trong trường hợp đó, bạn sẽ cần macro loại đang được phát triển ngay bây giờ: http://docs.scala-lang.org/overviews/macros/typemacros.html –
(trừ khi tất nhiên, bạn biết những phím nào trên bản đồ trước thời hạn, và đã có một trường hợp với các thành viên phù hợp - trong trường hợp đó phản ánh đơn giản sẽ đủ) –