Пардон, не заметил. Но тогда я тем более не вижу смысла.
Почему? Человеческий фактор - возможность что-то забыть - разве не считается аргументом, чтобы компилятор следил а переприсвоил ли ты значение внутри тела подпрограммы переменной, переданной как 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, но реализовать когда будет желание)?
Ну, как хотите. Главное, чтобы не было так жёстко, как в C#.
А такое где-то водится?
На мой взгляд, var, const, out было бы уже более чем достаточно. На начальном этапе, разумеется.
Если в C# не присвоить out-параметру до выхода из тела метода значение, то код не пройдет компиляцию:
The out parameter `x’ must be assigned to before control leaves the current method
, например:
using System;
class MainClass
{
public static void Method(out int x) // <-- Да не тут то было - где присвоение x?
{
}
public static void Main(string[] args)
{
}
}
Нет. Логика тут другая. Сделать Issue означает, что когда-то это придётся реализовывать.
А я не уверен, что это нужно.
Есть конечно такой формат Proposals, 95% из которых бешеные, но попадаются и вполне разумные - их потом реализуют если это посильно и не противоречит другим средствам языка.
Еще раз - наш опыт начального обучения говори о том, что out - никак не сказывается на обучении. Мы это можем со всей ответственностью утверждать - каждый год у нас около 300 школьников учатся программированию. out - средство профессионального программирования - это да, чтобы снизить вероятность глупой ошибки и сделать код более документированным.
Погодите, но почему нельзя ученикам простыми словами объяснить зачем нужен out? Думаю, они поймут. И будут пользоваться, если все время их направлять на правильный путь, что правильно. И не позволять писать хоть бы как. Ваша задача сделать из учеников - высококвалифицированных специалистов. Так? Так пусть пользуются тем, что знают и понимают. И идут в ногу со временем, используя современные средства программирования.
Так его в языке еще нет. Как он может на обучении сказываться?
Никто не обязывает Вас делать на днях. Ведь можете через месяц, год, позже. А можете и удалить Issue. Так?