2010-07-27 20 views
5

Khi tôi sử dụng bảng điều khiển scala, nó sẽ in một đối tượng theo kiểu rõ ràng, ví dụ:Làm cách nào để kiểm tra đối tượng trong tập lệnh như trong bảng điều khiển scala?

scala> val mike = ("mike", 40, "New York") 
mike: (java.lang.String, Int, java.lang.String) = (mike,40,New York) 

Nhưng nếu tôi viết trong một tập tin script, như:

val mike = ("mike", 40, "New York") 
println(mike) 

Nó chỉ in:

(mike,40,New York) 

Làm thế nào tôi có thể làm trong tập tin kịch bản như scala console? Có phương pháp cho việc này không?

Trả lời

11

Bạn có thể lấy kiểu của một biến với một Manifest:

scala> def dump[T: Manifest](t: T) = "%s: %s".format(t, manifest[T]) 
dump: [T](t: T)(implicit evidence$1: Manifest[T])String 

scala> dump((1, false, "mike")) 
res3: String = (1,false,mike): scala.Tuple3[Int, Boolean, java.lang.String] 

Nếu suy ra loại T là một loại trừu tượng, thì phải có một tiềm ẩn Manifest[T] cung cấp, nếu không điều này sẽ không biên dịch.

scala> trait M[A] { 
    | def handle(a: A) = dump(a) 
    | } 
<console>:7: error: could not find implicit value for evidence parameter of type 
Manifest[A] 
      def handle(a: A) = dump(a) 

Bạn có thể tạo ra một phiên bản cung cấp một mặc định cho Manifest[T] tham số ẩn trong trường hợp này:

scala> def dump2[T](t: T)(implicit mt: Manifest[T] = null) = "%s: %s".format(t, 
    | if (mt == null) "<?>" else mt.toString) 
dump2: [T](t: T)(implicit mt: Manifest[T])String 

scala> trait M[A] { 
    | def handle(a: A) = dump2(a) 
    | } 
defined trait M 

scala> (new M[String] {}).handle("x") 
res4: String = x: <?> 
+0

nhờ cho câu trả lời của bạn. Mặc dù nó quá khó cho tôi để hiểu bây giờ (tôi chỉ học nó trong 2 ngày), nhưng tôi nghĩ rằng tôi sẽ đọc nó một cách cẩn thận một ngày nào đó :) – Freewind

+0

Điều này in loại đó là tốt đẹp, nhưng nó sẽ là tuyệt vời để xem các giá trị thực tế – cevaris

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