Szukaj…


Składnia

  • moduł my.package;
  • import my.package;
  • import my.package: function;
  • import fancyName = mypackage;
  • import my.package: fancyFunctionName = function;

Uwagi

Moduły automatycznie udostępniają zakres przestrzeni nazw dla ich zawartości. Moduły powierzchownie przypominają klasy, ale różnią się tym, że:

  • Istnieje tylko jedna instancja każdego modułu i jest on przydzielany statycznie.
  • Nie ma wirtualnego stołu.
  • Moduły nie dziedziczą, nie mają super modułów itp.
  • Tylko jeden moduł na plik.
  • Symbole modułów można importować.
  • Moduły są zawsze kompilowane w zasięgu globalnym i nie mają na nie wpływu otaczające atrybuty lub inne modyfikatory.
  • Moduły można grupować w hierarchie zwane pakietami.

Moduły dają kilka gwarancji:

  • Kolejność importowania modułów nie wpływa na semantykę.
  • Na semantykę modułu nie ma wpływu to, co go importuje.
  • Jeśli moduł C importuje moduły A i B, wszelkie modyfikacje B nie spowodują dyskretnej zmiany kodu w C zależnego od A.

Globalny import

import std.stdio;
void main()
{
    writeln("Hello World!");
}

Wiele importów można określić w tym samym wierszu, oddzielając je comma lub w nowym wierszu.

import std.stdio, std.math;
import std.datetime;
void main()
{
    writeln("2^4: ", pow(2, 4));
    writeln("Current time: ", Clock.currTime());
}

Selektywny import

Selektywne importowanie może pomóc w oczyszczeniu przestrzeni nazw i jeszcze bardziej przyspieszyć czas kompilacji, ponieważ kompilator musi tylko przeanalizować określone, wybrane funkcje.

import std.stdio: writeln;
void main()
{
    writeln("Hello world");
}

Import lokalny

Można również importować symbole w dowolnym zakresie, import będzie sprawdzany tylko wtedy, gdy zakres jest potrzebny (tj. Skompilowany), a importowane nazwy będą widoczne tylko w importowanym zakresie. Najczęściej zakres importu lokalnego to funkcje, struktury i klasy.

void main()
{
    import std.stdio: writeln;
    writeln("Hello world");
}
// writeln isn't defined here

Import publiczny

Moduły można wystawiać na działanie innych modułów z public imports .

public import std.math;
// only exports the symbol 'pow'
public import std.math : pow;

Zmieniono nazwę importu

Można podać lokalną nazwę importu, za pomocą której wszystkie odwołania do symboli modułu muszą być kwalifikowane za pomocą:

import io = std.stdio; 
void main()
{
    io.writeln("Hello world");
    std.stdio.writeln("hello!"); // error, std is undefined
    writeln("hello!");           // error, writeln is undefined
}

Importowane nazwy importu są przydatne w przypadku bardzo długich nazw importów.

Zmiana nazwy i selektywny import

Można również zmienić nazwę importu selektywnego.

void main()
{
    import std.stdio : fooln = writeln;
    fooln("Hello world");
}

Deklaracja modułu

Moduły mają bezpośrednią korespondencję z plikami źródłowymi. Nazwa modułu to domyślnie nazwa pliku z usuniętą ścieżką i rozszerzeniem, którą można ustawić jawnie za pomocą deklaracji modułu. ModuleDeclaration ustawia nazwę modułu i do którego pakietu należy. Jeśli nie ma, nazwa modułu jest traktowana jako ta sama nazwa (pozbawiona ścieżki i rozszerzenia) nazwy pliku źródłowego.

module my.fancy.module;


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow