2012-08-03 19 views
8

Nhiệm vụ của tôi là tìm tên các tham số của kiểu chữ, trong đó có các giá trị mặc định.Làm thế nào để kiểm tra tham số nào của lớp chữ thường có giá trị mặc định khi sử dụng phản xạ scala 2.10

Trong 2,9 Tôi đã sử dụng ScalaSigParser từ scalap và đã làm một cái gì đó tương tự như:

(...) 
case x: MethodSymbol if x.name.startsWith("init$default$") => (...) 
(...) 

Tôi đã hy vọng rằng phản ánh trong 2.10 sẽ cung cấp cho tôi quyền truy cập dễ dàng hơn để loại thông tin này.

Cuối cùng tôi muốn viết một macro, mà tôi sẽ bao gồm trong trường hợp đối tượng đồng hành lớp, mà sẽ tự động tạo ra một mã cho serialization/deserialization của trường hợp đó lớp. Để làm điều đó tôi cần phải biết những tham số nào có giá trị mặc định.

Trả lời

3

Hiện tại không có cách nào để làm điều đó, tuy nhiên tôi vừa gửi yêu cầu kéo (https://github.com/scala/scala/pull/1047) có thêm TermSymbol.isDefaultParam, hiển thị chức năng được yêu cầu. Tôi hy vọng nó sẽ biến nó thành RC1 và 2.10.0 cuối cùng.

scala> case class C(x: Int, y: Int = 2) 
defined class C 

scala> val ctor = typeOf[C].declaration(nme.CONSTRUCTOR).asMethod 
ctor @ 39fe9830: reflect.runtime.universe.MethodSymbol = constructor C 

scala> ctor.params.flatten filter (_.asTerm.isDefaultParam) 
res0 @ 7ad2093b: List[reflect.runtime.universe.Symbol] = List(value y) 
+0

Tuyệt vời, cảm ơn! –

+0

Allrighty yêu cầu kéo đã được sáp nhập, và nó sẽ được bao gồm trong 2,10.0. –

+1

Có vẻ như 'params' bây giờ là' paramss' và phương thức 'isDefaultParam' được đổi tên thành' isParamWithDefault' trong cả hai phiên bản 2.10 và 2.11 – lyomi

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