D Language
Import i moduły
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;