我目前正在玩弄宏了一下,也許這是一個不好的想法,但這裏的PARAM是我的問題:斯卡拉宏分配解構功能
我有以下宏:
def using[A <: { def close(): Unit }, B](resource: A)(f: A => B) = macro usingImpl[A, B]
def usingImpl[A <: { def close(): Unit }, B](c: Context)(resource: c.Expr[A])(f: c.Expr[A => B]): c.Expr[B] = {
import c.universe._
f.tree match {
case Function(params, body) =>
//val ValDef(modifiers, name, tpt, _) = params.head
c.Expr[B](
Block(
List(
//ValDef(modifiers, name, tpt, resource.tree)
ValDef(params.head.symbol, resource.tree)
),
body
)
)
case _: Select =>
reify {
val res = resource.splice
try {
f.splice(res)
} finally {
res.close()
}
}
}
}
在Select
的情況下,我只需調用該函數並關閉資源即可正常工作。但在Function
的情況下,我想將參數值分配給資源並調用正文。當我使用ValDef
的已棄用創建者時,需要Symbol
和Tree
,一切正常。如果我使用的是過時的4-args創建者,我收到一個編譯器錯誤,指出值x$1
不在範圍內。當我在看代碼,這兩個版本的產品,它看起來完全一樣:
Expr[Int]({
<synthetic> val x$1: Test.Foo = new Test.this.Foo();
x$1.bar.+(23)
})
有可能的方式,簡單地使用params.head
並分配一個值?謝謝你的幫助!
編輯:
我這樣調用宏:
object Test extends App {
import Macros._
class Foo {
def close() {}
def bar = 3
}
println(using(new Foo)(_.bar + 3))
}
正如我所說的,如果我使用了註釋的版本,它給了我一個編譯器錯誤,即打印AST和最後這條消息:[error] symbol value x$1 does not exist in Test$delayedInit$body.apply
而且我正在使用2.10.1。
解構'params.head'應該可以很好地工作 - 我不能重現你的錯誤(使用2.10.0或者2.10.1),並且實際上在未註釋的版本中出現編譯器錯誤。你可以發佈你用來調用宏的代碼嗎? – 2013-05-08 23:42:19
更新了我的問題 – drexin 2013-05-09 00:08:56
您一直在試圖使Scala中的析構函數?好想法! – 2014-01-21 00:36:58