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

Пардон, не заметил. Но тогда я тем более не вижу смысла.

Почему? Человеческий фактор - возможность что-то забыть - разве не считается аргументом, чтобы компилятор следил а переприсвоил ли ты значение внутри тела подпрограммы переменной, переданной как 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, но реализовать когда будет желание)?

Ну, как хотите. Главное, чтобы не было так жёстко, как в C#.

А такое где-то водится?

На мой взгляд, var, const, out было бы уже более чем достаточно. На начальном этапе, разумеется. :slight_smile:

Если в 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? Думаю, они поймут. И будут пользоваться, если все время их направлять на правильный путь, что правильно. И не позволять писать хоть бы как. :slight_smile: Ваша задача сделать из учеников - высококвалифицированных специалистов. Так? Так пусть пользуются тем, что знают и понимают. И идут в ногу со временем, используя современные средства программирования.

Так его в языке еще нет. Как он может на обучении сказываться?

Никто не обязывает Вас делать на днях. Ведь можете через месяц, год, позже. А можете и удалить Issue. Так?