Применить метод, используемый в типе [Scala]

Я просматривал Scala-код и обнаружил, что метод apply также используется в type,

Пример:
type Common = {
  def apply: {val func: {} => {val a: A}; val c: C} => {val b: B}
}

Что означает приведенный выше код?

Как я понимаю, это означает, что Common относится ко всем типам, к которым относится метод apply. Но вопрос в том, какой метод применения это означает? Какими должны быть входные данные метода apply?

Также,

type Common = {
  def apply({val func: {} => {val a: A}; val c: C} => {val b: B})
}

В чем разница между двумя общими типами?

1 ответ

Решение

Это известно как структурный тип. Это просто означает, что вы описываете тип по его структуре вместо (только) по имени. Тип Foo{val a: String} означает "что-то, что имеет тип Foo но также имеет val a: String". {val a: String} такой же как AnyRef{val a: String}, Так {} средства AnyRef{}что в основном означает то же самое, что и AnyRef,

Конечно, вы также можете использовать структурные типы в структурных типах, что Common делает. Common это подтип AnyRef, который имеет apply метод, который не принимает аргументов, но возвращает функцию с некоторыми сложными структурными типами в качестве аргументов типа. Чтобы расшифровать их, нужно просто рекурсивно применить правила из первого абзаца.

Как бы вы использовали это Common тип? Я рекомендую не, но...

scala> :paste
// Entering paste mode (ctrl-D to finish)

class A; class B; class C

type Common = {
  def apply: {val func: {} => {val a: A}; val c: C} => {val b: B}
}

class HasA { val a = new A }

class HasB { val b = new B }

class HasC {
  val func = (a: AnyRef) => new HasA
  val c = new C
}

class MyCommon { def apply = (h: Any) => new HasB }

// Exiting paste mode, now interpreting.


scala> def common(c: Common) = c
common: (c: Common)Common

scala> common(new MyCommon)
res0: Common = MyCommon@3652a0d8

scala> res0.apply(new HasC)
res1: AnyRef{val b: B} = HasB@3925c40e

scala> res1.b
res2: B = B@1ba053df

Вызовы методов структурных типов могут также вызывать накладные расходы времени выполнения, так как они реализуются с отражением.

Другие вопросы по тегам