Size: a a a

2018 September 21

MD

Maxim Dmitriev in Alprog I/O
Александр Тужик
Тут нужно понимать, что сложные конструкции не появляются сами собой. Они вводятся в язык для того, чтобы решать какую-то проблему, которую сложно решить "обычным" кодом.
Можно конкретнкю задачу которую решает этот код
источник

MD

Maxim Dmitriev in Alprog I/O
Толтко не абстрактную у нас есть такие то классы которые придумал безумный прогамист надо чтобы они что то порешали между собой
источник

АТ

Александр Тужик in Alprog I/O
Сейчас сделаю тебе синтетический пример.
источник

MD

Maxim Dmitriev in Alprog I/O
Интересно было бы глянуть
источник

АТ

Александр Тужик in Alprog I/O
Очень тяжело придумать пример достаточно сложный, чтобы была ощутимая польза какая-то от лямбд, но при этом достаточно простой, чтобы ты его понял.
источник

АТ

Александр Тужик in Alprog I/O
Лучшее что придумал:
источник

АТ

Александр Тужик in Alprog I/O
int count = 0;
for (int x = 0; x < 1000; x++)
{
 for (int y = 0; y < 1000; y++)
 {  
   for (int z = 0; z < 1000; z++)
   {
     var cell = cell[x][y][z];
     if (cell.color == red)
     {
       var monster = cell.SpawnRandomMonster();
       Debug.Log(x, y, z, monster.name);
       count++;
     }
   }
 }
}
источник

АТ

Александр Тужик in Alprog I/O
Здесь мы бежим по трёхмерному массиву, и если ячейка красная, то создаём случайного монстра в этой ячейке, пишем об этом сообщение в лог. И заодно ведём подсчёт монстров.
источник

АТ

Александр Тужик in Alprog I/O
Но что, если создание монстра будет зависить от того, сколько красных клеток? То есть нам надо передать в SpawnRandomMonster количество в качестве аргумента. Но мы его заранее не знаем, а бежать дважды по массиву дорого, потому что он большой.
источник

АТ

Александр Тужик in Alprog I/O
А монстров при этом как правило 2-3.
источник

АТ

Александр Тужик in Alprog I/O
С замыканием всё просто получается:
источник

АТ

Александр Тужик in Alprog I/O
int count = 0;
var actions = new List<Action>();
for (int x = 0; x < 1000; x++)
{
 for (int y = 0; y < 1000; y++)
 {
   for (int z = 0; z < 1000; z++)
   {
     var cell = cell[x][y][z];
     if (cell.color == red)
     {
       actions.Add(() => {
         var monster = cell.SpawnRandomMonster(count);
         Debug.Log(x, y, z, monster.name);
       });
       count++;
     }
   }
 }
}

foreach (var action in actions)
{
 action();  
}
источник

АТ

Александр Тужик in Alprog I/O
Минимальные изменения кода и это всё ещё одна функция.
источник

АТ

Александр Тужик in Alprog I/O
В то время как если ты попробуешь переписать это "обычным" кодом, то тебе придётся создать класс, который будет хранить в себе все локальные переменные x, y, z, name и cell
источник

АТ

Александр Тужик in Alprog I/O
Создать ещё одну функцию, которой будешь передавать этот класс.
источник

АТ

Александр Тужик in Alprog I/O
В общем будет очень много лишнего никому не нужного кода.
источник

N

Nekita in Alprog I/O
@alprog привет! У меня вопросы по поводу кикстартера: как долго вы готовились к сбору, как готовились, сколько денег потратили на подготовку? Я для своей игры хочу там сбор начать, но боюсь, что просто все провалю
источник

EM

E Myan in Alprog I/O
Nekita
@alprog привет! У меня вопросы по поводу кикстартера: как долго вы готовились к сбору, как готовились, сколько денег потратили на подготовку? Я для своей игры хочу там сбор начать, но боюсь, что просто все провалю
Жанр/платформа?
источник

N

Nekita in Alprog I/O
E Myan
Жанр/платформа?
Стратегия-симулятор производителя мобилок под пекусы
источник

MD

Maxim Dmitriev in Alprog I/O
Спасибо за пример, но в реальной игре ты обычно знаешь сколько создал красных клеток. Ты же сам их создаешь и мог подсчитать. А значит и спавнить монмтров просто параметром передал бы.
Как я и думал реальных проблем этот код не решает. Только "синтетические" головоломки.
источник