2012-11-01 34 views
8

Chúng ta có thể lấy loại val s: String bằng cách sử dụng sự phản chiếu từ bên ngoài của hàm f?Phản ánh kiểu kết cấu phụ

val f = (r: {val s: String}) => { 
} 
+0

Dưới 2.9 hoặc 2.10 hoặc không quan trọng? –

+0

Nó không quan trọng 2,9 hoặc 2,10. Nhưng tôi thường sử dụng 2.9.2. – sndyuk

+1

Tôi rất nghi ngờ nó có thể trong 2.9 mà không làm việc với trình biên dịch. Trong 2,10 có api phản xạ có thể sẽ cho phép kiểm tra kiểu 'r'. – pedrofurla

Trả lời

10
scala> import scala.reflect.runtime.{universe => ru} 
import scala.reflect.runtime.{universe=>ru} 

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> def typeOf[T: ru.TypeTag](x: T) = ru.typeOf[T] // capture compile-time type info 
typeOf: [T](x: T)(implicit evidence$1: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.Type 

scala> val f = (r: {val s: String}) => {} 
f: AnyRef{val s: String} => Unit = <function1> 

scala> val tpe = typeOf(f) 
tpe: reflect.runtime.universe.Type = scala.AnyRef{val s: String} => Unit 

scala> ru.showRaw(tpe) 
res0: String = TypeRef(ThisType(scala), scala.Function1, List(RefinedType(List(TypeRef(ThisType(scala), newTypeName("AnyRef"), List())), Scope(newTermName("s"))), TypeRef(ThisType(scala), scala.Unit, List()))) 

scala> val ru.TypeRef(_, _, refinement :: _) = tpe 
refinement: reflect.runtime.universe.Type = scala.AnyRef{val s: String} 

Với Scala phản ánh người ta cũng có thể tạo ra mocks với nhiều loại cấu trúc như sau: https://gist.github.com/4008389. Gist được liên kết thực hiện điều này bằng cách sử dụng các hộp công cụ và phản chiếu thời gian chạy, nhưng kịch bản này cũng có thể thực hiện được với các macro.

+0

Bạn sử dụng phiên bản Scala nào? Tôi nhận được một cảnh báo về câu lệnh cuối cùng: 'warning: abstract type pattern reflect.runtime.universe.TypeRef được bỏ chọn vì nó được loại bỏ bằng cách xóa bỏ ' – sschaef

+1

Việc nhập khẩu là cần thiết. Nó mang đến một thẻ lớp cho TypeRef vào phạm vi, loại bỏ cảnh báo không được kiểm soát. –

+0

Có cách nào để tạo ví dụ về sàng lọc không? – sndyuk

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