這裏是工廠的想法試一下(我以前做過,放棄了,但也讓我們再試一次):
object Brickwall
case class Brickwall[A](brick: A)
trait Monoman {
var wall: Ref[this.type, Brickwall[String]]
def ref[V](v: V): Ref[this.type, V]
}
object Ref {
implicit def unwrap[Repr](r: Ref[_, Repr]): Repr = r.repr
implicit def wrap[A, Repr](repr: Repr): Ref[A, Repr] = new Impl[A, Repr](repr)
private class Impl[A, Repr](val repr: Repr) extends Ref[A, Repr]
}
trait Ref[A, Repr] { def repr: Repr }
def test(m: Monoman): Unit = {
val w0 = m.wall
val w1 = w0.copy(brick = "3.1415")
m.wall = w1 // doesn't convert to Ref
}
因此而解纏是透明的,重新包裝不似乎正在工作,我懷疑它不可能得到它的工作,再次因爲m.type
永遠不能推斷。
謝謝moritz。嗯,是的,我應該說,我試圖解決強迫我的框架的用戶端正在寫這個,m.type ...這是一個DSL,我不想看到任何明確的打字如果可能的話。試圖找到一種解決方法來約束對獨特上下文的引用,以免它們逃脫。菲利普·哈勒和馬丁·奧德斯基發現了一篇非常有趣的論文(我以前見過但沒有注意):http://lamp.epfl.ch/~phaller/capabilities.html - 可能是我只需要解決這個想法,我想要的是不可能沒有編譯插件 – 2011-04-07 02:06:38