Предложения export

Предложение export определяет псевдонимы для выбранных членов объекта.

Например:

class BitMap
class InkJet

class Printer:
  type PrinterType
  def print(bits: BitMap): Unit = println("Printer.print()")
  def status: List[String] = ???

class Scanner:
  def scan(): BitMap =
    println("Scanner.scan()")
    BitMap()
  def status: List[String] = ???

class Copier:
  private val printUnit = new Printer { type PrinterType = InkJet }
  private val scanUnit = new Scanner

  export scanUnit.scan
  export printUnit.{status as _, *}

  def status: List[String] = printUnit.status ++ scanUnit.status

Два пункта export определяют следующие псевдонимы экспорта в классе Copier:

final def scan(): BitMap            = scanUnit.scan()
final def print(bits: BitMap): Unit = printUnit.print(bits)
final type PrinterType              = printUnit.PrinterType

Доступ к ним возможен как изнутри Copier, так и снаружи:

val copier = new Copier
copier.print(copier.scan())
// Scanner.scan()
// Printer.print()

Предложение export имеет тот же формат, что и предложение импорта. Его общая форма:

export path . { sel_1, ..., sel_n }

Оно состоит из выражения квалификатора path, которое должно быть стабильным идентификатором и за которым следует один или несколько селекторов sel_i, определяющих, что получает псевдоним. Селекторы могут быть одной из следующих форм:

Элемент имеет право на export, если выполняются все следующие условия:

Возникает ошибка времени компиляции, если простой селектор или селектор переименования не идентифицирует какие-либо подходящие элементы.

Члены типа получают псевдонимы в соответствии с определениями типов, а члены-термины - в соответствии с определениями методов. Псевдонимы экспорта копируют параметры типа и значения элементов, на которые они ссылаются. Псевдонимы экспорта всегда final. Псевдонимы given экземпляров снова определяются как given. Псевдонимы расширений снова определяются как расширения. Псевдонимы встроенных методов или значений снова определяются как inline. Других модификаторов, которые можно присвоить псевдониму, нет.

Это имеет следующие последствия для переопределения:

Псевдонимы экспорта для определений общедоступных значений, доступ к которым осуществляется без ссылки на private значения в пути к квалификатору, помечаются компилятором как "стабильные", а их типы результатов являются одноэлементными типами определений с псевдонимами. Это означает, что их можно использовать как часть путей стабильных идентификаторов, хотя технически они являются методами. Например, следующее допустимо:

class C { type T }
object O { val c: C = ... }
export O.c
def f: c.T = ...

Ограничения:


Ссылки: