2013-01-13 45 views
7

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 đồ

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) 
+0

Còn về hướng khác, 'Map (fieldName -> fieldValue)' đối với lớp chữ thường? –

+0

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 –

+0

(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ẽ đủ) –

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