Применить метод, используемый в типе [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
Вызовы методов структурных типов могут также вызывать накладные расходы времени выполнения, так как они реализуются с отражением.