Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2014-09-24 20:31:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
"Евреи - не жалейте заварки!"
Как известно, в .NET-e такой код прекрасно работает:

using System;
namespace Vars {
	class Vars {
		public static void For (int l, int u, Action proc) {
			for (int i = l; i < u; ++ i)
				proc (i);
		}

		public static void Main (string[] args) {
			var s = 0;
			For (1, 10, (i) => { s += i; });
			Console.WriteLine ("N={0}", s);
		}
	}
}
Также известно, что мелкомягкие скоммуниздили из Паскаля Var-параметры (ref и out), что позволило им (как собственно и Вирту) решить проблему безопасной передачи переменных по ссылке: указатели типа С увы страдают тем, что их можно присвоить переменной с временем жизни большим чем запись активации функции, где эта переменная находится - и здравствую висячая ссылки и segfault.

Var-ссылки этим недостатком не страдают потому как их время жизни гарантировано меньше.

Умный Вирт однако понимал, что процедурные параметры тоже нужны и сделал еще аналогичный спецификатор для параметров процедур. Чего мелкомягкие не скоммуниздили - и закономерно огребли:

Вот такое уже не работает:
		public static void SumNat (int to, ref int s) {
			For (1, to, (i) => { s += i; });
		}

		public static void Main (string[] args) {
			var s = 0;
			SumNat (10, ref s); 
			Console.WriteLine ("N={0}", s);
		}
Говорит:

Error CS1628: Parameter `s' cannot be used inside `lambda expression' when using `ref' or `out' modifier (CS1628) (Vars)

А такое разумеется фиксит:
		public static void SumNat (int to, ref int s) {
		    var ss = s;
			For (1, to, (i) => { ss += i; });
			s = ss;
		}
Природа явления imho вполне понятна (если кому-то непонятна - пишите - поясню), но вот стандартные же грабли - сделать "ограниченный" спецификатор для параметра-указателя на переменную и не сделать того же самого для параметра-функции....

В общем - subj.