Переместиться к: _ArrayEq · assumeSafeAppend · capacity · destroy · dup · Error · Exception · hashOf · idup · Interface · Object · OffsetTypeInfo · opEquals · reserve · RTInfo · Throwable · TypeInfo · TypeInfo_Class
Object
.toString
();
toHash
();
opCmp
(Object obj
);
this < obj | < 0 |
this == obj | 0 |
this > obj | > 0 |
opEquals
(Object o
);
o
.
Реализация по умолчанию сравнивает только по идентичности (используется оператор is).
Обычно, переопределение для opEquals
должно пытаться сравнивать объекты по их содержанию.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); }
opEquals
(const Object lhs
, const Object rhs
);
true
, если lhs
и rhs
равны.Interface
* появляется как первая запись в его vtbl.classinfo
;
classinfo
для этого интерфейса (не для содержащего класса)offset
;
offset
;
ti
;
getHash
(in void* p
);
void* p |
указатель на начало экземпляра типа |
equals
(in void* p1
, in void* p2
);
compare
(in void* p1
, in void* p2
);
tsize
();
swap
(void* p1
, void* p2
);
next
();
next
' type, as defined by what kind of type this is,
null
if none.null
. После некоторого исследования у меня выяснилось, что для массивов метод next() возвращает тип элемента, для ассоциативных массивов — тип значения, для всех остальных типов, проверенных мной, возвращалось null
— прим. пер.initializer
();
null
ptr and a length equal to the type size will be returned. Для статического массива будет возвращён встроенный инциализатор для единственного элемента массива, используйте tsize, чтобы получить правильный размер.init
= initializer;
flags
();
offTi
();
null
если не доступноoffTi()
возвращала пустой массив — прим. пер.destroy
(void* p
);
postblit
(void* p
);
postblit
на объекте и всех под-объектахpostblit
обозначается конструктор копирования this(this)
— прим. пер.talign
();
argTypes
(out TypeInfo arg1
, out TypeInfo arg2
);
rtInfo
();
m_init
;
name
;
vtbl
;
interfaces
;
base
;
find
(in char[] classname
);
classname
classname
.
null
, если не найденоcreate
();
Throwable
. Класс Exception, являющийся производным от этого класса,
представляет категорию объектов исключений, безопасных, чтобы их ловить и обрабатывать.
В принципе, не следует ловить объекты Throwable
,
которые не являются производными от Exception,
так как они представляют неисправимые ошибки времени выполнения.
Определенные гарантии времени выполнения могут не выполняться, когда выбрасываются эти ошибки,
делая ненадежным продолжение выполнения после их отлова.msg
;
file
;
line
;
file
и номер строки line
исходного кода D, соответствующие месту, откуда была брошена ошибка.info
;
next
;
toString
и возвращает сообщение об ошибке.
Внутренне перенаправляет к перегруженному методу toString
, который принимает делегат.toString
(scope void delegate(in char[]) sink
);
toString
, который принимает делегат, чтобы предотвратить распределение памяти сборщиком мусора, которые не могут быть выполнены в определенных ошибочных ситуациях. Перекройте этот метод toString
, чтобы исправить по своему усмотрению сообщение об ошибке.Exception
, представляют ошибки времени выполнения, которые не надо ловить, поскольку определенные гарантии времени выполнения могут не выполняться, что делает небезопасным продолжение выполнения программы.msg
, string file
= __FILE__, size_t line
= __LINE__, Throwable next
= null);
next
используется внутренне и всегда должен быть null
при передаче пользовательским кодом.
Этот конструктор не бросает автоматически вновь созданное Исключение; для этой цели должно быть использовано утверждение throw.Error
, так как они представляют неисправимые ошибки времени выполнения.
Определенные гарантии времени выполнения может не выполняться,
когда брошены эти ошибки, делая ненадежным продолжение выполнения после их отлова.msg
, Throwable next
= null);
next
используется внутренне и всегда должен быть null
при передаче пользовательским кодом.
Этот конструктор не бросает автоматически вновь созданный Error;
для этой цели должно быть использовано утверждение throw.bypassedException
;
null
, если никакие исключения не зависли.destroy
(T)(T obj
)capacity
(T)(T[] arr
);
capacity
(ёмкость) среза.
capacity
является размером, до которого срез можно увеличить до того, как основной массив должен будет перераспределиться или расшириться.
Замечание:
capacity
среза может быть уплотнена действиями с другими срезами.
//Срез статического массива: нет ёмкости int[4] sarray = [1, 2, 3, 4]; int[] slice = sarray[]; assert(sarray.capacity == 0); //Добавление к срезу вызывает перераспределение в новый массив slice ~= 5; assert(slice.capacity >= 5); //Срезы динамического массива int[] a = [1, 2, 3, 4]; int[] b = a[1 .. $]; int[] c = a[1 .. $ - 1]; debug(SENTINEL) {} else // не нулевая ёмкость очень зависит от массива и реализации GC { assert(a.capacity != 0); assert(a.capacity == b.capacity + 1); //a and b разделяют один и тот же хвост } assert(c.capacity == 0); //добавление к c должно перераспределить c.
reserve
(T)(ref T[] arr
, size_t newcapacity
);
//Срез статического массива: нет ёмкости. //Резервирование вызывает перераспределение. int[4] sarray = [1, 2, 3, 4]; int[] slice = sarray[]; auto u = slice.reserve(8); assert(u >= 8); assert(sarray.ptr !is slice.ptr); assert(slice.capacity == u); //Срезы динамического массива int[] a = [1, 2, 3, 4]; a.reserve(8); //подготовить для добавления ещё 4 элементов auto p = a.ptr; u = a.capacity; a ~= [5, 6, 7, 8]; assert(p == a.ptr); //не должен был перераспределяться assert(u == a.capacity); //не должен был расширяться
assumeSafeAppend
(T)(auto ref inout(T[]) arr
);
int[] a = [1, 2, 3, 4]; // Без assumeSafeAppend. Добавление перераспределяет память. int[] b = a [0 .. 3]; b ~= 5; assert(a.ptr != b.ptr); debug(SENTINEL) {} else { // С assumeSafeAppend. Добавление перезаписывает. int[] c = a [0 .. 3]; c.assumeSafeAppend() ~= 5; assert(a.ptr == c.ptr); // Добавлю, что теперь a == [1, 2, 3, 5] - прим. пер. }
_ArrayEq
(T1, T2)(T1[] a1
, T2[] a2
);
hashOf
(T)(auto ref T arg
, size_t seed
= 0);
arg
с начальной величиной seed
(семя).
Результат может быть не равен typeid(T).getHash(&arg
)
Величина seed
может быть использована для хэш-цепочки:
struct Test { int a; string b; MyObject c; size_t toHash() const @safe pure nothrow { size_t hash = a.hashOf(); hash = b.hashOf(hash); size_t h1 = c.myMegaHash(); hash = h1.hashOf(hash); //Смешать два хэш-значения return hash; } }
RTInfo
(T);
RTInfo
для типа Tdup
(T)(T[] a
)dup
(T)(const(T)[] a
).dup
.idup
(T)(T[] a
);
idup
(T : void)(const(T)[] a
);
.idup
.