object
Формирует символы, доступные для всех программ D. Включает Object, который является корнем иерархии объектов класса. Этот модуль импортируется неявно.
- Лицензия:
- Boost License 1.0.
- Авторы:
- Walter Bright, Sean Kelly
- class Object;
-
Все объекты класса D наследуют от Object.
- string toString();
-
Преобразовать объект в удобочитаемую строку.
- nothrow @trusted size_t toHash();
-
Вычислить хеш-функцию для объекта.
- int opCmp(Object o);
-
Сравнить с другим объектом obj.
- Возвращает:
this < obj < 0 this == obj 0 this > obj > 0
- bool opEquals(Object o);
-
Проверить, равен ли
thiso. По умолчанию реализация сравнивает только по идентичности (используя операторis). Обычно переопределения дляopEqualsдолжны пытаться сравнить объекты по их содержимому. - static Object factory(string classname);
-
Создать экземпляр класса, заданного полным квалифицированным именем classname. Класс должен быть либо без конструкторов, либо иметь конструктор по умолчанию.
- Возвращает:
- null в случае ошибки
- Пример
module foo.bar; class C { this() { x = 10; } int x; } void main() { auto c = cast(C)Object.factory("foo.bar.C"); assert(c !is null && c.x == 10); }
- bool opEquals(const Object lhs, const Object rhs);
-
Возвращает true, если lhs и rhs равны.
- Примеры:
- Если ссылки указывают на один и тот же объект или оба null => равны
class F { int flag; this(int flag) { this.flag = flag; } } F f; assert(f == f); // both null f = new F(1); assert(f == f); // both aliased to the same object
- Примеры:
- Если любой из них null => не равны
class F { int flag; this(int flag) { this.flag = flag; } } F f; assert(!(new F(0) == f)); assert(!(f == new F(0)));
- Примеры:
- Если типы идентичны => один вызов метода opEquals
class F { int flag; this(int flag) { this.flag = flag; } override bool opEquals(const Object o) { return flag == (cast(F) o).flag; } } F f; assert(new F(0) == new F(0)); assert(!(new F(0) == new F(1)));
- Примеры:
- Общий случай => симметричные вызовы метода opEquals
int fEquals, gEquals; class Base { int flag; this(int flag) { this.flag = flag; } } class F : Base { this(int flag) { super(flag); } override bool opEquals(const Object o) { fEquals++; return flag == (cast(Base) o).flag; } } class G : Base { this(int flag) { super(flag); } override bool opEquals(const Object o) { gEquals++; return flag == (cast(Base) o).flag; } } assert(new F(1) == new G(1)); assert(fEquals == 1); assert(gEquals == 1);
- struct Interface;
-
Информация об интерфейсе. Когда к объекту обращаются через интерфейс, Interface* появляется в качестве первого элемента в его vtbl.
- TypeInfo_Class classinfo;
-
.classinfo для этого интерфейса (не для содержащего класса)
- size_t offset;
-
Смещение интерфейса 'this' от объекта 'this'
- struct OffsetTypeInfo;
-
Массив пар, задающих смещение и информацию о типе для каждого члена в агрегате.
- size_t offset;
-
Смещение члена от начала объекта
- TypeInfo ti;
-
TypeInfo для этого члена
- abstract class TypeInfo;
-
Информация о типе во время выполнения. Может быть получена для любого типа с помощью TypeidExpression.
- const nothrow @trusted size_t getHash(scope const void* p);
-
Вычисляет хеш экземпляра типа.
- Параметры:
void* pуказатель на начало экземпляра типа
- Возвращает:
- хеш
- Ошибки:
- исправить https://issues.dlang.org/show_bug.cgi?id=12516, например, изменив это на действительно безопасный интерфейс.
- const bool equals(in void* p1, in void* p2);
-
Сравнивает два экземпляра на равенство.
- const int compare(in void* p1, in void* p2);
-
Сравнивает два экземпляра по операторам <, == или >.
- const pure nothrow @nogc @property @safe size_t tsize();
-
Возвращает размер типа.
- const void swap(void* p1, void* p2);
-
Меняет местами два экземпляра типа.
- inout pure nothrow @nogc @property inout(TypeInfo) next();
-
Получить TypeInfo для типа 'next', как определено типом, null, если нет.
- abstract const pure nothrow @nogc @safe const(void)[] initializer();
-
Возвращает значение по умолчанию. Если тип должен быть инициализирован нулями, возвращается массив с нулевым указателем и длиной, равной размеру типа. Для статических массивов это возвращает значение по умолчанию для одного элемента массива. Используйте
tsizeдля получения правильного размера. - const pure nothrow @nogc @property @safe uint flags();
-
Получить флаги типа: 1 означает, что GC должен сканировать указатели, 2 означает, что аргумент этого типа передаётся в регистр SIMD, если он доступен
- const const(OffsetTypeInfo)[] offTi();
-
Получить информацию о типе содержимого типа; null, если недоступно
- const void destroy(void* p);
-
Выполнить деструктор для объекта и всех его подобъектов
- const void postblit(void* p);
-
Выполнить postblit для объекта и всех его подобъектов
- const pure nothrow @nogc @property @safe size_t talign();
-
Возвращает выравнивание типа
- nothrow @safe int argTypes(out TypeInfo arg1, out TypeInfo arg2);
-
Возвращает внутреннюю информацию об аргументах, помещающихся в 8 байт. См. X86-64 ABI 3.2.3
- const pure nothrow @nogc @property @safe immutable(void)* rtInfo();
-
Возвращает информацию, используемую сборщиком мусора для точной сборки.
- class TypeInfo_Class: object.TypeInfo;
-
Информация о типе класса во время выполнения. Может быть получена из экземпляра объекта с помощью свойства .classinfo.
- byte[] m_init;
-
Статическая инициализация класса (init.length даёт размер класса в байтах)
- string name;
-
Имя класса
- void*[] vtbl;
-
Таблица указателей на виртуальные функции
- Interface[] interfaces;
-
Реализуемые интерфейсы этого класса
- TypeInfo_Class base;
-
Базовый класс
- static const(TypeInfo_Class) find(scope const char[] classname);
-
Поиск во всех модулях TypeInfo_Class, соответствующего classname.
- Возвращает:
- null, если не найдено
- const Object create();
-
Создать экземпляр объекта, представленного 'this'.
- final const pure nothrow @nogc @trusted bool isBaseOf(scope const TypeInfo_Class child);
-
Возвращает true, если класс, описанный
child, наследуется от или является классом, описанным этимTypeInfo_Class. Всегда возвращает false, если аргумент null.- Параметры:
TypeInfo_Class childTypeInfo для какого-либо класса
- Возвращает:
- true, если класс, описанный
child, наследуется от или является классом, описанным этимTypeInfo_Class.
- struct ModuleInfo;
-
Экземпляр ModuleInfo генерируется в объектный файл для каждого скомпилированного модуля.
Он предоставляет доступ к различным аспектам модуля. Он не генерируется для betterC.
- const pure nothrow @nogc @property void function() tlsctor();
-
- Возвращает:
- конструктор модуля для локальных данных потоков,
nullесли его нет
- const pure nothrow @nogc @property void function() tlsdtor();
-
- Возвращает:
- деструктор модуля для локальных данных потоков,
nullесли его нет
- const pure nothrow @nogc @property void* xgetMembers();
-
- Возвращает:
- адрес функции модуля
const(MemberInfo)[] getMembers(string),nullесли её нет
- const pure nothrow @nogc @property void function() ctor();
-
- Возвращает:
- конструктор модуля,
nullесли его нет
- const pure nothrow @nogc @property void function() dtor();
-
- Возвращает:
- деструктор модуля,
nullесли его нет
- const pure nothrow @nogc @property void function() ictor();
-
- Возвращает:
- независимый от порядка конструктор модуля,
nullесли его нет
- const pure nothrow @nogc @property void function() unitTest();
-
- Возвращает:
- адрес функции, выполняющей модульные тесты,
nullесли её нет
- const pure nothrow @nogc @property immutable(ModuleInfo*)[] importedModules();
-
- Возвращает:
- массив указателей на ModuleInfo импортированных модулей
- const pure nothrow @nogc @property TypeInfo_Class[] localClasses();
-
- Возвращает:
- массив ссылок TypeInfo_Class для классов, определённых в этом модуле
- const pure nothrow @nogc @property string name();
-
- Возвращает:
- имя модуля,
nullесли имя отсутствует
- class Throwable;
-
Базовый класс всех выбрасываемых объектов.
Все выбрасываемые объекты должны наследоваться от Throwable. Класс
Exception, который наследуется от этого класса, представляет категорию выбрасываемых объектов, которые безопасно перехватывать и обрабатывать. В принципе, не следует перехватывать объекты Throwable, которые не наследуются отException, так как они представляют невосстанавливаемые ошибки во время выполнения. Некоторые гарантии во время выполнения могут не выполняться, когда выбрасываются эти ошибки, делая небезопасным продолжение выполнения после их перехвата.- string msg;
-
Сообщение, описывающее ошибку.
- string file;
-
Имя файла исходного кода D, соответствующего месту, откуда была выброшена ошибка.
- size_t line;
-
Номер строки исходного кода D, соответствующего месту, откуда была выброшена ошибка.
- TraceInfo info;
-
Стек вызовов, где произошла ошибка. Это непрозрачный объект, который можно преобразовать в
string, или итерировать с помощьюforeach, чтобы извлечь элементы стека вызовов (как строки). - inout pure nothrow @nogc @property scope @safe inout(Throwable) next() return;
-
- Возвращает:
- Ссылка на следующую ошибку в списке. Это используется, когда новая
Throwableвыбрасывается изнутри блокаcatch. Исходно перехваченнаяExceptionбудет присоединена к новойThrowableчерез это поле.
- pure nothrow @nogc @property scope @safe void next(Throwable tail);
-
Заменить next в цепочке на
tail. ИспользуйтеchainTogetherвместо этого, если это возможно. - final pure nothrow @nogc ref scope @system uint refcount() return;
-
- Возвращает:
- изменяемая ссылка на счетчик ссылок, который равен 0 - выделено сборщиком мусора, 1 - выделено d_newThrowable(), и >=2 это счетчик ссылок + 1
- Примечание
- Отмечено как
@systemдля предотвращения случайного использования.
- int opApply(scope int delegate(Throwable) dg);
-
Перебрать цепочку Throwables.
- static pure nothrow @nogc @system Throwable chainTogether(return scope Throwable e1, return scope Throwable e2);
-
Добавить
e2к цепочке исключений, которая начинается сe1.- Параметры:
Throwable e1начало цепочки (может быть null) Throwable e2вторая часть цепочки (может быть null)
- Возвращает:
- Throwable, который находится в начале цепочки; null, если оба
e1иe2равны null
- string toString();
-
Переопределяет
Object.toStringи возвращает сообщение об ошибке. Внутренне это перенаправляется на перегрузкуtoStringкоторая принимает параметр sink делегат. - const void toString(scope void delegate(in char[]) sink);
-
Иерархия Throwable использует перегрузку toString, которая принимает делегат sink, чтобы избежать выделения памяти сборщиком мусора, что невозможно в определённых ситуациях с ошибками. Переопределите этот
toStringметод для настройки сообщения об ошибке. - const const(char)[] message();
-
Получить сообщение, описывающее ошибку. Базовое поведение - вернуть поле
Throwable.msg. Переопределите для возвращения другого сообщения об ошибке.- Возвращает:
- Сообщение об ошибке
- class Exception: object.Throwable;
-
Базовый класс всех ошибок, которые безопасно перехватывать и обрабатывать.
В принципе, только выбрасываемые объекты, производные от этого класса, безопасно перехватывать внутри блока
catch. Выбрасываемые объекты, не производные от Exception, представляют ошибки во время выполнения, которые не следует перехватывать, так как некоторые гарантии во время выполнения могут не выполняться, что делает небезопасным продолжение выполнения программы.- Примеры:
-
bool gotCaught; try { throw new Exception("msg"); } catch (Exception e) { gotCaught = true; assert(e.msg == "msg"); } assert(gotCaught);
- pure nothrow @nogc @safe this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable nextInChain = null);
-
Создаёт новый экземпляр Exception. Параметр nextInChain используется внутренне и всегда должен быть
nullпри передаче кодом пользователя. Этот конструктор не выбрасывает создаваемое исключение автоматически; для этой цели необходимо использовать операторthrow.
- class Error: object.Throwable;
-
Базовый класс всех невосстановимых ошибок во время выполнения.
Это представляет категорию
Throwableобъектов, которые не безопасно перехватывать и обрабатывать. В принципе, не следует перехватывать объекты Error, так как они представляют невосстановимые ошибки во время выполнения. Некоторые гарантии во время выполнения могут не выполняться, когда выбрасываются эти ошибки, делая небезопасным продолжение выполнения после их перехвата.- Примеры:
-
bool gotCaught; try { throw new Error("msg"); } catch (Error e) { gotCaught = true; assert(e.msg == "msg"); } assert(gotCaught);
- pure nothrow @nogc @safe this(string msg, Throwable nextInChain = null);
-
Создаёт новый экземпляр Error. Параметр nextInChain используется внутренне и всегда должен быть
nullпри передаче кодом пользователя. Этот конструктор не выбрасывает создаваемую ошибку автоматически; для этой цели необходимо использовать операторthrow. - Throwable bypassedException;
-
Первая
Exception, которая была проигнорирована при выбрасывании этой ошибки, илиnullесли никакихExceptionне было в очереди.
- void clear(Value, Key)(Value[Key] aa);
-
Удаляет все оставшиеся ключи и значения из ассоциативного массива.
- Параметры:
Value[Key] aaАссоциативный массив.
- T rehash(T : Value[Key], Value, Key)(T aa);
-
Переупорядочивает ассоциативный массив на месте, чтобы улучшить производительность поиска.
- Параметры:
T aaАссоциативный массив.
- Возвращает:
- Переупорядоченный ассоциативный массив.
- V[K] dup(T : V[K], K, V)(T aa);
-
Создаёт новый ассоциативный массив того же размера и копирует содержимое ассоциативного массива в него.
- Параметры:
T aaАссоциативный массив.
- pure nothrow @nogc @safe auto byKey(T : V[K], K, V)(T aa);
-
Возвращает диапазон для перебора ключей ассоциативного массива.
- Параметры:
T aaАссоциативный массив.
- Возвращает:
- Диапазон.
- pure nothrow @nogc @safe auto byValue(T : V[K], K, V)(T aa);
-
Возвращает диапазон для перебора значений ассоциативного массива.
- Параметры:
T aaАссоциативный массив.
- Возвращает:
- Диапазон.
- pure nothrow @nogc @safe auto byKeyValue(T : V[K], K, V)(T aa);
-
Возвращает диапазон вперед над парами ключ-значение ассоциативного массива.
- Параметры:
T aaАссоциативный массив.
- Возвращает:
- Диапазон вперед.
- @property Key[] keys(T : Value[Key], Value, Key)(T aa);
-
Возвращает динамический массив, элементами которого являются ключи в ассоциативном массиве.
- Параметры:
T aaАссоциативный массив.
- Возвращает:
- Динамический массив.
- @property Value[] values(T : Value[Key], Value, Key)(T aa);
-
Возвращает динамический массив, элементами которого являются значения в ассоциативном массиве.
- Параметры:
T aaАссоциативный массив.
- Возвращает:
- Динамический массив.
- inout(V) get(K, V)(inout(V[K]) aa, K key, lazy inout(V) defaultValue);
-
Ищет ключ; если он существует, возвращает соответствующее значение, иначе вычисляет и возвращает defaultValue.
- Параметры:
inout(V[K]) aaАссоциативный массив. K keyКлюч. inout(V) defaultValueЗначение по умолчанию.
- Возвращает:
- Значение.
- ref V require(K, V)(ref V[K] aa, K key, lazy V value = V.init);
-
Ищет ключ; если он существует, возвращает соответствующее значение, иначе вычисляет значение, добавляет его в ассоциативный массив и возвращает его.
- Параметры:
V[K] aaАссоциативный массив. K keyКлюч. V valueТребуемое значение.
- Возвращает:
- Значение.
- Примеры:
-
auto aa = ["k1": 1]; assert(aa.require("k1", 0) == 1); assert(aa.require("k2", 0) == 0); assert(aa["k2"] == 0);
- void update(K, V, C, U)(ref V[K] aa, K key, scope C create, scope U update)
Constraints: if (is(typeof(create()) : V) && (is(typeof(update(aa[K.init])) : V) || is(typeof(update(aa[K.init])) == void))); -
Ищет ключ; если он существует, применяет вызываемый объект обновления, иначе вычисляет вызываемый объект создания и добавляет его в ассоциативный массив
- Параметры:
V[K] aaАссоциативный массив. K keyКлюч. C createВызываемый объект для применения при создании. U updateВызываемый объект для применения при обновлении.
- Примеры:
-
auto aa = ["k1": 1]; aa.update("k1", { return -1; // create (won't be executed) }, (ref int v) { v += 1; // update }); assert(aa["k1"] == 2); aa.update("k2", { return 0; // create }, (ref int v) { v = -1; // update (won't be executed) }); assert(aa["k2"] == 0);
- size_t hashOf(T)(auto ref T arg, size_t seed);
size_t hashOf(T)(auto ref T arg); -
Вычисляет значение хеша
argс необязательнымseedначальным значением. Результат может не совпадать сtypeid(T).getHash(&arg).- Параметры:
T argаргумент для вычисления значения хеша size_t seedнеобязательное seedзначение (может использоваться для цепочки хеширования)
- Возвращает
- вычисленное значение хеша
arg
- Примеры:
-
class MyObject { size_t myMegaHash() const @safe pure nothrow { return 42; } } struct Test { int a; string b; MyObject c; size_t toHash() const pure nothrow { size_t hash = a.hashOf(); hash = b.hashOf(hash); size_t h1 = c.myMegaHash(); hash = h1.hashOf(hash); //Mix two hash values return hash; } }
- immutable size_t[pointerBitmap.length] RTInfoImpl(size_t[] pointerBitmap);
-
Создает RTInfo для типа T
- enum immutable(void)* rtinfoNoPointers;
-
ярлыки для точного сборщика мусора, также генерируемые компилятором и используемые вместо фактической карты указателей
- @property auto dup(T)(T[] a)
Constraints: if (!is(const(T) : T));
@property T[] dup(T)(const(T)[] a)
Constraints: if (is(const(T) : T)); -
Предоставляет свойство массива .dup.
- Примеры:
-
auto arr = [1, 2]; auto arr2 = arr.dup; arr[0] = 0; assert(arr == [0, 2]); assert(arr2 == [1, 2]);
- @property immutable(T)[] idup(T)(T[] a);
@property immutable(T)[] idup(T : void)(const(T)[] a); -
Предоставляет свойство массива .idup.
- Примеры:
-
char[] arr = ['a', 'b', 'c']; string s = arr.idup; arr[0] = '.'; assert(s == "abc");
- pure nothrow @property @trusted size_t capacity(T)(T[] arr);
-
(Свойство) Получает текущую емкость среза. Емкость — это размер, до которого может вырасти срез, прежде чем для подлежащего массива потребуется перераспределение или расширение.
Если при добавлении необходимо перераспределить срез без возможности расширения, то возвращается
0. Это происходит, когда срез ссылается на статический массив или если другой срез ссылается на элементы за пределами текущего среза.- Примечание
- Емкость среза может изменяться из-за операций с другими срезами.
- Примеры:
-
//Static array slice: no capacity int[4] sarray = [1, 2, 3, 4]; int[] slice = sarray[]; assert(sarray.capacity == 0); //Appending to slice will reallocate to a new array slice ~= 5; assert(slice.capacity >= 5); //Dynamic array slices int[] a = [1, 2, 3, 4]; int[] b = a[1 .. $]; int[] c = a[1 .. $ - 1]; debug(SENTINEL) {} else // non-zero capacity very much depends on the array and GC implementation { assert(a.capacity != 0); assert(a.capacity == b.capacity + 1); //both a and b share the same tail } assert(c.capacity == 0); //an append to c must relocate c.
- pure nothrow @trusted size_t reserve(T)(ref T[] arr, size_t newcapacity);
-
Зарезервировать емкость для среза. Емкость — это размер, до которого может вырасти срез, прежде чем для подлежащего массива потребуется перераспределение или расширение.
- Возвращает:
- Новая емкость массива (которая может быть больше, чем запрошенная емкость).
- Примеры:
-
//Static array slice: no capacity. Reserve relocates. int[4] sarray = [1, 2, 3, 4]; int[] slice = sarray[]; auto u = slice.reserve(8); assert(u >= 8); assert(&sarray[0] !is &slice[0]); assert(slice.capacity == u); //Dynamic array slices int[] a = [1, 2, 3, 4]; a.reserve(8); //prepare a for appending 4 more items auto p = &a[0]; u = a.capacity; a ~= [5, 6, 7, 8]; assert(p == &a[0]); //a should not have been reallocated assert(u == a.capacity); //a should not have been extended
- nothrow ref @system inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr);
-
Предположим, что добавление в этот массив безопасно. Добавления, сделанные в этот массив после вызова этой функции, могут добавляться на месте, даже если массив был срезом большего массива с самого начала.
Используйте это только тогда, когда точно известно, что нет элементов, используемых за пределами массива в блоке памяти. Если они есть, эти элементы будут перезаписаны добавлением в этот массив.
- Предупреждение
- Вызов этой функции и последующее использование ссылок на данные, расположенные после данного массива, приводит к неопределенному поведению.
- Возвращает:
- Возвращается входной параметр.
- Примеры:
-
int[] a = [1, 2, 3, 4]; // Without assumeSafeAppend. Appending relocates. int[] b = a [0 .. 3]; b ~= 5; assert(a.ptr != b.ptr); debug(SENTINEL) {} else { // With assumeSafeAppend. Appending overwrites. int[] c = a [0 .. 3]; c.assumeSafeAppend() ~= 5; assert(a.ptr == c.ptr); }
- void destroy(bool initialize = true, T)(ref T obj)
Constraints: if (is(T == struct));
void destroy(bool initialize = true, T)(T obj)
Constraints: if (is(T == class));
void destroy(bool initialize = true, T)(T obj)
Constraints: if (is(T == interface));
void destroy(bool initialize = true, T : U[n], U, size_t n)(ref T obj)
Constraints: if (!is(T == struct) && !is(T == class) && !is(T == interface));
void destroy(bool initialize = true, T)(ref T obj)
Constraints: if (!is(T == struct) && !is(T == interface) && !is(T == class) && !__traits(isStaticArray, T)); -
Удаляет данный объект и, по желанию, сбрасывает в исходное состояние. Используется для удаления объекта, вызывая его деструктор или финализатор, чтобы он больше не ссылался на другие объекты. Это не запускает цикл сборки мусора или освобождает память сборщика мусора. Если
initializeуказаноfalse, объект считается недействительным после удаления и не должен ссылаться на него.- Примеры:
- Демонстрация типа ссылки
class C { struct Agg { static int dtorCount; int x = 10; ~this() { dtorCount++; } } static int dtorCount; string s = "S"; Agg a; ~this() { dtorCount++; } } C c = new C(); assert(c.dtorCount == 0); // destructor not yet called assert(c.s == "S"); // initial state `c.s` is `"S"` assert(c.a.dtorCount == 0); // destructor not yet called assert(c.a.x == 10); // initial state `c.a.x` is `10` c.s = "T"; c.a.x = 30; assert(c.s == "T"); // `c.s` is `"T"` destroy(c); assert(c.dtorCount == 1); // `c`'s destructor was called assert(c.s == "S"); // `c.s` is back to its inital state, `"S"` assert(c.a.dtorCount == 1); // `c.a`'s destructor was called assert(c.a.x == 10); // `c.a.x` is back to its inital state, `10` // check C++ classes work too! extern (C++) class CPP { struct Agg { __gshared int dtorCount; int x = 10; ~this() { dtorCount++; } } __gshared int dtorCount; string s = "S"; Agg a; ~this() { dtorCount++; } } CPP cpp = new CPP(); assert(cpp.dtorCount == 0); // destructor not yet called assert(cpp.s == "S"); // initial state `cpp.s` is `"S"` assert(cpp.a.dtorCount == 0); // destructor not yet called assert(cpp.a.x == 10); // initial state `cpp.a.x` is `10` cpp.s = "T"; cpp.a.x = 30; assert(cpp.s == "T"); // `cpp.s` is `"T"` destroy!false(cpp); // destroy without initialization assert(cpp.dtorCount == 1); // `cpp`'s destructor was called assert(cpp.s == "T"); // `cpp.s` is not initialized assert(cpp.a.dtorCount == 1); // `cpp.a`'s destructor was called assert(cpp.a.x == 30); // `cpp.a.x` is not initialized destroy(cpp); assert(cpp.dtorCount == 2); // `cpp`'s destructor was called again assert(cpp.s == "S"); // `cpp.s` is back to its inital state, `"S"` assert(cpp.a.dtorCount == 2); // `cpp.a`'s destructor was called again assert(cpp.a.x == 10); // `cpp.a.x` is back to its inital state, `10`
- Примеры:
- Демонстрация типа значения
int i; assert(i == 0); // `i`'s initial state is `0` i = 1; assert(i == 1); // `i` changed to `1` destroy!false(i); assert(i == 1); // `i` was not initialized destroy(i); assert(i == 0); // `i` is back to its initial state `0`
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/object.html