2014-12-31 28 views
2

我試圖收集封閉範圍內的所有vals。宏未找出封閉的值

這是宏實現:

import scala.language.experimental.macros 
import scala.reflect.macro.blackbox.Context 

def impl(c: Context) = { 
    import c.universe._ 
    c.Expr[Seq[Any]](q"Seq(..${ 
    c.internal.enclosingOwner.owner.typeSignature.decls.collect { 
     case s if s.isTerm && s.asTerm.isVal => Ident(s) 
    } 
    })") 
} 

def get(c: Context) = macro impl 

這是我如何應用它:

object Foo { 
    val foo = "" 
    def poo = get 
} 

然後把它扔到了一個錯誤,沒有任何意義對我說:

error: symbol value foo does not exist in Foo.poo 

這是爲什麼發生?你如何防止它?

回答

1

你不想要Ident方法需要一個符號,你想要Ident.apply,它需要一個Name

替換Ident(s)Ident(s.name)(或者更清楚一點q"this.$s")將工作。

+0

哦,它工作:)謝謝!你認爲'Ident(Name)'可以隨時使用嗎?有沒有我應該使用'Ident(Symbol)'的情況? –

+0

說實話,自從引入了quasiquotes以來,我還沒有使用'Ident'和朋友,而且在我的頭頂,我無法想到以前使用'Ident(symbol)'的情況,或者文檔中的示例等等 –

+0

好的......謝謝你:) –