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}) => {
}
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}) => {
}
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.
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
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. –
Có cách nào để tạo ví dụ về sàng lọc không? – sndyuk
Dưới 2.9 hoặc 2.10 hoặc không quan trọng? –
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
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