Замечания и предложения

А, действительно страшная тайна. Тогда приношу свои извинения.

@RAlex, таки сделали опрос.

Что мешает сделать ключевое слово, которое заставляет назначить значение переменной, переданной по ссылке, внутри подпрограммы? Просто заставляет, больше ничего. Человек есть человек, он может что-то забыть. А если ему напомнит что-то присвоить переменной компилятор - это же хорошо.

Повторяю третий(!) раз: в Паскале автоинициализируются простые типы(Int32, Byte и подобные). Им по умолчанию присвоен 0. Если Вам так хочется, можете сделать проверку параметра на nil и выдавать исключение. А вообще,

Дело было вечером - делать было нечего.

Повторюсь, что можно сделать ключевое слово, которое заставляет передавать переменную по ссылке (как var), а также заставляет переприсвоить ей какое-то значение до выхода из тела подпрограммы.

Это и есть 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. Если сделать так, как Вы предлагаете, то придётся дописывать лишнюю строчку кода.

Сейчас @Admin будет порядок наводить :smile:

С одной стороны - да, код стал длиннее. Но с другой, начинающий явно описывает действия программы.

Я уже полностью понимаю товарища @RAlex’а. Не надо портить язык.

C#, по-Вашему, тоже испортили, когда ввели out? А Object Pascal? Сделаю акцент на втором из языков. И вообще, давайте, наконец, выслушаем разработчиков. Решение всегда последнее за ними.

Второе сейчас, конечно, очень актуально…

Но повод ли это исключать из аргументов? Разве в язык ввели это просто так, лишь бы было?

Не убрали, а вывели пока в другую ветку. Оказалось, что там больше делать, чем мы считали изначально. Когда будут готовы, то попадут в Release.

Да, это хорошая штука. Только для начинающих плохо писать везде ref и out при вызове. Мне для начинающих это не нравится.

Надо сказать еще одно. С появлением кортежей стало возможно возвращать из функции несколько значений, и var-out-параметры стали меньше нужны. Ну и конечно в языке со ссылочной организацией объектов можно передать ссылку по значению - и var и ref-эффекты автоматически будут обеспечены. Причем, нельзя объявить ссылку на константу как в C++.

Я также рассматриваю появившуюся в C# возможность описывать out-переменную прямо при вызове:

Square(2,3, out var res)

Хорошая штука, но пока на процесс начального обучения не очень ложится.

1 лайк

Если Вы не отвергайте, то Вы можете, как говорится, отложить в долгий ящик это (я имею ввиду на GitHub Issue сделать, посвященную out, но реализовать когда будет желание)?