Считаю, что связываться к реализацией констант в блоке - ненужное дело. Полезность очень сомнительна. Если смотреть на константу, как разновидность переменной, доступной только на чтение, она сродни одноэлементному кортежу. Если уж так приспичило - можно описать его. А если делать полноценно, для констант надо разрешить и кортежную инициализацию и многое другое. Надо разрешать последовательности и массивы констант (а почему нет)? В целом - переписывать массу кода и неизвестно сколько при этом наделать ошибок. А оно того стоит?
Не думаю, что будет правильно использовать одноэлементные кортежи для замены констант. Так как кортежи используются в основном для группировки значений, а не для того, чтобы имитировать константы.
Услышать бы мнение разработчиков…
Да, Вы правы. Признаю, ошибся.
Кроме того, это будет ещё и медленнее.
Ну, этот пример правильный, но не все константы - это что то с известным заранее значением. Константы - это так же то, что нельзя менять после инициализации.
Вопрос касательно справки. Почему в списке удалённых из языка конструкций числится library
, in
, abstract
и default
?
Ошибка должно быть. В языке они присутствуют.
type
TClass = class // Или record.
const c = 0;
end;
begin
end.
Там же, в разделе Отсутствует->Пункт 13:
Константы-поля классов.
Пример программы доказывает абсолютно обратное.
Кстати, почему об этом в справке ничего не сказано:
type
TA<T> = class
end;
TB<T> = class(TA<T>)
end;
begin
var x := new TB<byte>();
var y := x as TA<byte>;
var z := TA&<byte>(x); // <-- Можно
end.
?
Вот так попробуйте:
var z := TA&<byte>(x);
Спасибо.
Если элемент массива не инициализировать при прочетнии его элемента будет выдаваться ошибка. Это баг или фича(с учётом того, что все типы тут классы)?
какого типа элемент?
Это если объявить Functions : array [0…10] of array of string;
То там где присвоения не было по идее должны быть массив нулевой длинны. А на деле отладчик пишет что там nil Но исполнение самой программы таки правильно - это у меня ошибка в коде оказалась. Если ставить проверку Length(Functions[j])>0 - то нормально отрабатывает. Вот как я себе представляю оргазизацию дин. массив в Delphi - http://4.bp.blogspot.com/-jilcCFolsYc/T2j2b-L1QWI/AAAAAAAAARk/ynvgzGDDPjE/s1600/Dynamic-Array-In-Memory.png При ней nil быть не может даже для нулевого числа элементов.
Вот реализация Length
:
function Length(a: &Array): integer;
begin
if a = nil then
Result := 0
else Result := a.Length;
end;
Насчёт той диаграммы по ссылке - я не понял что она означает. Но в .Net у всех ссылочных типов значение по умолчанию - nil
.
В паскале есть всего несколько типов реализованных по особому. К примеру типизированные файлы - это ссылочные типы, но паскаль всегда инициализирует их сам, поэтому они не могут быть nil. И это только ради совместимости со старыми паскалями.
Но массив - это стандартный .Net -овский тип. Если у него значение поумолчанию будет не nil - это сломает совместимость с .Net .
Это больше звучит как будто это будет выдавать ошибку:
begin
var a: array[1..2] of array of byte;
writeln(a[1]);
end.
Это выводит nil
. Но, на сколько я понял, вы имеете в виду этот случай:
begin
var a: array[1..2] of array of byte;
writeln(a[1][0]);
end.
Но, даже если бы массив всегда инициализировался массивом с 0 элеметов - это всё равно выдало бы ошибку, потому что тут индекс выходит за границы.
Статический массив динамических массивов? Ммм, это что-то новенькое