2012-12-11 22 views

Trả lời

5

Lưu ý rằng cách tiếp cận :power trong câu trả lời Paul Butcher của cung cấp cho bạn truy cập vào API nội bộ, mà có lẽ không phải là một trong hai cần thiết hoặc mong muốn nếu bạn đang cố gắng làm điều này trong một macro (hoặc trong phản xạ thời gian chạy bên ngoài REPL, cho vấn đề đó).

Vì vậy, ví dụ gọi isConstructor trên một đồng bằng cũ Symbol cung cấp bởi members trong Reflection API công cộng sẽ không làm việc-bạn đầu tiên cần phải chắc chắn rằng bạn có một MethodSymbol. Tương tự với tpe. Tất nhiên, bạn có thể truyền tới các API nội bộ trong mã không REPL, nhưng điều này là nguy hiểm và không cần thiết. Sau đây là một giải pháp tốt hơn:

import scala.reflect.runtime.universe._ 

class Foo(name: String, i: Int) { def this(name: String) = this(name, 0) } 

typeOf[Foo].declaration(nme.CONSTRUCTOR).asTerm.alternatives.collect { 
    case m: MethodSymbol => m.paramss.map(_.map(_.name)) 
} 

Hoặc chỉ:

typeOf[Foo].declarations.collect { 
    case m: MethodSymbol if m.isConstructor => m.paramss.map(_.map(_.name)) 
} 

Cả hai sẽ cung cấp cho bạn như sau:

List(List(List(name, i)), List(List(name))) 

Như mong muốn. Tôi đã sử dụng phản chiếu thời gian chạy ở đây để đơn giản hóa ví dụ, nhưng điều này sẽ hoạt động chính xác theo cùng cách với số Universe bạn nhận được từ số Context trong macro.

+0

Ah - điểm tốt về: chế độ nguồn. Cảm ơn vì đã cứu đỏ mặt của tôi! –

1

bảng điểm REPL này sẽ giúp bạn đi, tôi hy vọng:

Welcome to Scala version 2.10.0-RC5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_09). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> :power 
** Power User mode enabled - BEEP WHIR GYVE ** 
** :phase has been set to 'typer'.   ** 
** scala.tools.nsc._ has been imported  ** 
** global._, definitions._ also imported ** 
** Try :help, :vals, power.<tab>   ** 

scala> class Foo(x: Int, y: Float) 
defined class Foo 

scala> (typeOf[Foo].members find (_.isConstructor)).get.tpe.params map (_.name) 
res1: List[$r.intp.global.Symbol#NameType] = List(x, y) 
+0

Làm thế nào tôi có thể làm cho nó hoạt động trong lớp scala trong thời gian biên dịch? –

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