А, действительно страшная тайна. Тогда приношу свои извинения.
Что мешает сделать ключевое слово, которое заставляет назначить значение переменной, переданной по ссылке, внутри подпрограммы? Просто заставляет, больше ничего. Человек есть человек, он может что-то забыть. А если ему напомнит что-то присвоить переменной компилятор - это же хорошо.
Повторяю третий(!) раз: в Паскале автоинициализируются простые типы(Int32, Byte и подобные). Им по умолчанию присвоен 0. Если Вам так хочется, можете сделать проверку параметра на nil и выдавать исключение. А вообще,
Дело было вечером - делать было нечего
.
Повторюсь, что можно сделать ключевое слово, которое заставляет передавать переменную по ссылке (как var), а также заставляет переприсвоить ей какое-то значение до выхода из тела подпрограммы.
Нет. Только на половину. var не:
заставляет переприсвоить ей какое-то значение до выхода из тела подпрограммы
Пардон, не заметил. Но тогда я тем более не вижу смысла.
Почему? Человеческий фактор - возможность что-то забыть - разве не считается аргументом, чтобы компилятор следил а переприсвоил ли ты значение внутри тела подпрограммы переменной, переданной как out-параметр?
Да вот ведь блин! Зачем ОНО надо? Если человек не подписал значение, он поймёт об этом из-за появления ошибки. А вообще, идея очень сильно напоминает предложение с return. Не передал значение - расстрел.
За начинающими нужен хороший контроль со стороны компилятора.
Как человек поймет до запуска программы, что он забыл переприсвоить переменной значение в теле подпрограммы, если будет только var и const для передачи по ссылке? Что ему напомнит?
А это критично? Хорошо, приведу пример:
Procedure Selector(out res: SByte; val: Single);
Begin
If (val > 0)
Then res := 1
Else
If(val < 0)
Then res := -1;
End;
res по умолчанию имеет значение 0. Если сделать так, как Вы предлагаете, то придётся дописывать лишнюю строчку кода.
С одной стороны - да, код стал длиннее. Но с другой, начинающий явно описывает действия программы.
C#, по-Вашему, тоже испортили, когда ввели out? А Object Pascal? Сделаю акцент на втором из языков. И вообще, давайте, наконец, выслушаем разработчиков. Решение всегда последнее за ними.
Второе сейчас, конечно, очень актуально…
Но повод ли это исключать из аргументов? Разве в язык ввели это просто так, лишь бы было?
Не убрали, а вывели пока в другую ветку. Оказалось, что там больше делать, чем мы считали изначально. Когда будут готовы, то попадут в Release.
Да, это хорошая штука. Только для начинающих плохо писать везде ref и out при вызове. Мне для начинающих это не нравится.
Надо сказать еще одно. С появлением кортежей стало возможно возвращать из функции несколько значений, и var-out-параметры стали меньше нужны. Ну и конечно в языке со ссылочной организацией объектов можно передать ссылку по значению - и var и ref-эффекты автоматически будут обеспечены. Причем, нельзя объявить ссылку на константу как в C++.
Я также рассматриваю появившуюся в C# возможность описывать out-переменную прямо при вызове:
Square(2,3, out var res)
Хорошая штука, но пока на процесс начального обучения не очень ложится.
Если Вы не отвергайте, то Вы можете, как говорится, отложить в долгий ящик это (я имею ввиду на GitHub Issue сделать, посвященную out, но реализовать когда будет желание)?