Как я могу получить доступ к неявному «неявному», то есть def a [A: B] или def a [A <% B]? - PullRequest
5 голосов
/ 27 февраля 2012

например, мне нужен доступ к манифесту в функции def a[A:ClassManifest], чтобы получить класс стирания.Я могу использовать функцию Predef.implicitly, но в этом случае мой код будет таким же длинным, как если бы я использовал полную форму def a[A](implicit b:ClassManifest[A]).Так есть ли удобные сгенерированные имена для этих неявных аргументов?

Ответы [ 2 ]

5 голосов
/ 28 февраля 2012

В Predef есть три предопределенных метода, которые будут делать это в течение Manifest с, ClassManifest с и OptManifest с: manifest[T], classManifest[T] и optManifest[T] соответственно. Вы можете написать свои собственные такие «неявные получатели» для других классов типов в соответствии с тем же шаблоном. Вот например manifest[T]:

def manifest[T](implicit m: Manifest[T]) = m

Итак, вот как вы могли бы написать свой собственный:

trait UsefulTypeclass[A] {
  def info = 42 // sample method
}

// the “implicit getter”
def usefulTypeclass[A](implicit tc: UsefulTypeclass[A]) = tc

// a method that uses the implicit getter
def foo[A: UsefulTypeclass] =
  usefulTypeclass[A].info
0 голосов
/ 28 февраля 2012

Скальп на помощь!

Я взял этот код:

object TestThing extends App {
  def one { println("one") }
  def two[T] { println("two") }
  def three[T : Manifest] { println("three") }
  def four[T: Manifest, U : Manifest] { println("four") }
}

и провел через скальп.Вот что я получил:

object TestThing extends java.lang.Object with scala.App with scala.ScalaObject {
  def this() = { /* compiled code */ }
  def one : scala.Unit = { /* compiled code */ }
  def two[T] : scala.Unit = { /* compiled code */ }
  def three[T](implicit evidence$1 : scala.Predef.Manifest[T]) : scala.Unit = { /* compiled code */ }
  def four[T, U](implicit evidence$2 : scala.Predef.Manifest[T], evidence$3 : scala.Predef.Manifest[U]) : scala.Unit = { /* compiled code */ }
}

Как видите, первый неявный манифест называется evidence$1.Второе и третье - , хотя и в другом объеме! - называются evidence$2 и evidence$3.Итак ... вот как вы ссылаетесь на Манифесты.

Несмотря на это, мне немного страшно, что удаление Манифеста, который находится выше в классе, изменит название Манифеста, которыйнаходится ниже в файле.Точно так же не помогает то, что подсветка синтаксиса плагина IntelliJ Scala, кажется, думает, что переменные манифеста в области видимости в four() равны evidence$1 и evidence$2, и не думают, что evidence$3 является допустимымпеременная есть (хотя она есть, а evidence$1 нет).В целом, может быть, к этим вещам следует относиться как к предупреждающим знакам об игре с неявными переменными Manifest?

...