Учитывая значение некоторого пути-зависимого типа, как я могу получить экземпляр «контейнера»? - PullRequest
5 голосов
/ 08 февраля 2011

Это легче объяснить в коде:

class Bippy {
  val x = 42

  class Boppy {
    val y = "hello world"
  }

  val bop = new Boppy
}

val bip = new Bippy
val bop: Bippy#Boppy = bip.bop

bop затем передается другому методу, которому необходимо найти значение x из содержащего экземпляра Bippy.Что за магическое заклинание для этого?

Экземпляр bop происходит из кода, который я не контролирую, поэтому добавление новых методов к Boppy здесь не вариант.

Ответы [ 2 ]

7 голосов
/ 08 февраля 2011

Вы не можете.По крайней мере, не без обмана.Вот как можно обмануть.

def getOuter(bop : Bippy#Boppy) = 
   bop.asInstanceOf[{def Bippy$Boppy$$$outer() : Bippy}].Bippy$Boppy$$$outer()

Очевидно, что это очень зависит от деталей того, как скаляр работает сегодня, и никаких гарантий, что он будет работать завтра.

4 голосов
/ 08 февраля 2011

Как сказал Джеймс, ты не можешь. Его чит заставляет мои глаза кровоточить, и я предлагаю вместо этого сделать что-то еще; -)

Я настоятельно рекомендую модифицировать потребителей bop, если вы можете. Вместо того, чтобы передавать им экземпляр Bippy # Boppy, передайте им пару, содержащую значение зависимого типа и значение, от которого зависит тип,

trait DependentPack {
  val bippy : Bippy
  val boppy : bippy.Boppy
}

val bip = new Bippy
val bop = bip.bop
val dep = new DependentPack { val bippy = bip ; val boppy = bop }
foo(dep)

def foo(dp : DependentPack) = {
  import dp._
  // use bippy ...
  // use boppy ...
}

Обратите внимание, что это частично обходной путь из-за отсутствия зависимых типов методов (включается в scalac путем добавления ключей командной строки -Ydependent-method-types или -Xexperimental). Если бы они были у нас, то мы могли бы отбросить артефакты, такие как DependentPack, и переписать вышеприведенное как:

val bip = new Bippy
val bop = bip.bop
foo(bip)(bop)

def foo(bippy : Bippy)(boppy : bippy.Boppy) = {
  // use bippy ...
  // use boppy ...
}

Само собой разумеется, я думаю, что наличие зависимых типов методов, включенных по умолчанию, было бы очень желательно. Нетривиальное использование зависимых типов приносит им боль в их отсутствие, если вы не очень осторожны.

...