Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда

Лямбда-выраТСния (Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ C#)

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ объявлСния лямбда-выраТСния => для отдСлСния списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² лямбда-выраТСния ΠΎΡ‚ исполняСмого ΠΊΠΎΠ΄Π°. Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π΄Π²ΡƒΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΠΎΡ€ΠΌ:

Лямбда выраТСния, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² качСствС тСкста:

Лямбда ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Π±Π»ΠΎΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² качСствС тСкста:

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ) с Π»Π΅Π²ΠΎΠΉ стороны лямбда-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ Π±Π»ΠΎΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны.

Лямбда-выраТСния ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚ΠΈΠΏΡ‹ Π΄Π΅Ρ€Π΅Π²Π° выраТСния, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

Лямбда-выраТСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² любом ΠΊΠΎΠ΄Π΅, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ экзСмпляры Ρ‚ΠΈΠΏΠΎΠ² Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Task.Run(Action) для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-выраТСния ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ LINQ Π² C#, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

ВыраТСния-лямбды

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ с ΠΏΡ€Π°Π²ΠΎΠΉ стороны ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° => называСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ лямбда. ВыраТСния-лямбды Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ.

Лямбды ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

Лямбда-инструкция Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ инструкции Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки:

Π’Π΅Π»ΠΎ лямбды ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· любого количСства ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²; ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ…-Ρ‚Ρ€Π΅Ρ….

Лямбда-инструкции нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ лямбда-выраТСния

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ лямбда-выраТСния Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки. НулСвоС количСство Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ задаСтся пустыми скобками:

Если лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹:

Π”Π²Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ запятыми:

Иногда компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² явном Π²ΠΈΠ΄Π΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

Для Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² всС Ρ‚ΠΈΠΏΡ‹ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Π² явном, Π»ΠΈΠ±ΠΎ Π² нСявном Π²ΠΈΠ΄Π΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС компилятор Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ CS0748.

Начиная с C# 9.0, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пустыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда-выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ пустой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ лямбда-выраТСния ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для указания ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий.

АсинхронныС лямбда-выраТСния

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов async ΠΈ await ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ лямбда-выраТСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ. НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Windows Forms содСрТится ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ асинхронный ΠΌΠ΅Ρ‚ΠΎΠ΄ ExampleMethodAsync ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π΅Π³ΠΎ.

Π’Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ асинхронного лямбда-выраТСния. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ async ΠΏΠ΅Ρ€Π΅Π΄ списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² лямбда-выраТСния, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ создании ΠΈ использовании асинхронных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов Async ΠΈ Await.

Лямбда-выраТСния ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ

Π’ C# 7.0 прСдставлСна встроСнная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ. ΠšΠΎΡ€Ρ‚Π΅ΠΆ ΠΌΠΎΠΆΠ½ΠΎ ввСсти Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° лямбда-выраТСния, ΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях компилятор C# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° для опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°.

ΠšΠΎΡ€Ρ‚Π΅ΠΆ опрСдСляСтся ΠΏΡƒΡ‚Π΅ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² скобки списка Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с раздСлитСлями-запятыми. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ с трСмя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ чисСл Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Оно ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ с трСмя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, содСрТащий Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ умноТСния.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°Ρ… Π² C# см. Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π’ΠΈΠΏΡ‹ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ.

Лямбда-выраТСния со стандартными ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ запросов

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ запроса Count:

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти Ρ‚ΠΈΠΏ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π²Π²ΠΎΠ΄Π°; Π½ΠΎ Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π”Π°Π½Π½ΠΎΠ΅ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ подсчитываСт ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ значСния ( n ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π° Π΄Π²Π° Π΄Π°ΡŽΡ‚ остаток 1.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ нСсколько Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡƒΡ‚Π΅ΠΌ ΠΈΡ… Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² скобки. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС элСмСнты Π² массивС numbers Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ числа, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ мСньшС Π΅Π³ΠΎ порядкового Π½ΠΎΠΌΠ΅Ρ€Π° Π² массивС:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π² лямбда-выраТСниях

ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° опрСдСлСния Ρ‚ΠΈΠΏΠ° для лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚ΠΈΠΏ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°;

ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ нСявно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°;

Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ лямбда-выраТСния (Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ΅ имССтся) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ нСявно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°.

Π—Π°ΠΏΠΈΡΡŒ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ области видимости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² лямбда-выраТСниях

Лямбда-выраТСния ΠΌΠΎΠ³ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² области ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ»ΠΈ области Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΈΠΌ способом, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ для использования Π² лямбда-выраТСниях, Π΄Π°ΠΆΠ΅ Ссли Π±Ρ‹ Π² ΠΈΠ½ΠΎΠΌ случаС ΠΎΠ½ΠΈ оказались Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌΠΈ области дСйствия ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΠ»ΠΈΡΡŒ сборщиком мусора. Π’Π½Π΅ΡˆΠ½ΡΡ пСрСмСнная Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ присвоСна, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½Π° смоТСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² лямбда-выраТСниях. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ эти ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊ области дСйствия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² лямбда-выраТСниях.

ЗахвачСнная пСрСмСнная Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Π° сборщиком мусора Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΄Π΅Π»Π΅Π³Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° Π½Π΅Π΅ ссылаСтся, Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² статус ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΈ сборкС мусора.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, прСдставлСнныС Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ Π² Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅.

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ нСпосрСдствСнно Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ in, ref ΠΈΠ»ΠΈ out ΠΈΠ· Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ значСния Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ goto, break ΠΈΠ»ΠΈ continue, Ссли Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° находится Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π±Π»ΠΎΠΊΠ° лямбда-выраТСния. Если Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ°, использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ лямбда-выраТСния Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ошибкой.

Начиная с C# 9.0, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ static ΠΊ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ для прСдотвращСния Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ сохранСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ состояния экзСмпляров лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ:

БтатичСскоС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ состояниС экзСмпляров ΠΈΠ· ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… областСй, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° статичСскиС элСмСнты ΠΈ опрСдСлСния констант.

БпСцификация языка C#

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ функциях, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² C# 9.0, см. Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°Ρ… ΠΎ функциях:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Лямбда-выраТСния Π² C++

Π’ C++ 11 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, часто Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ лямбда– β€” это ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ опрСдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ( замыкания) нСпосрСдствСнно Π² располоТСнии, Π³Π΄Π΅ ΠΎΠ½ΠΎ вызываСтся ΠΈΠ»ΠΈ пСрСдаСтся Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ лямбда-выраТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для инкапсуляции Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ ΠΈΠ»ΠΈ асинхронным функциям. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ лямбда-выраТСния ΠΈ ΠΈΡ… сравнСниС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ программирования. Он описываСт ΠΈΡ… прСимущСства ΠΈ прСдоставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ

Части лямбда-выраТСния

Π’ стандартС ISO C++ дСмонстрируСтся простоС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ std::sort() Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°:

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ рисункС ΠΏΠΎΠΊΠ°Π·Π°Π½Π° структура лямбда-выраТСния:

Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. Π€ΠΎΡ‚ΠΎ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда

ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Capture (Ρ‚Π°ΠΊΠΆΠ΅ извСстноС ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ лямбда-выраТСния Π² спСцификации C++).

список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ…. (Π’Π°ΠΊΠΆΠ΅ называСтся лямбда-объявлСниСм)

измСняСмая спСцификация Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ….

БпСцификация Exception Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ….

Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠΉ-Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ….

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Capture

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² тСкстС (Π² C++ 14), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ области ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡ…. Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ начинаСтся с прСдлоТСния Capture. Он ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, являСтся Π»ΠΈ запись ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΠ»ΠΈ ΠΏΠΎ ссылкС. Доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ с прСфиксом ампСрсанда ( & ) осущСствляСтся ΠΏΠΎ ссылкС ΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅Ρ‚ доступа ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

ΠŸΡƒΡΡ‚ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ фиксации ( [ ] ) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π΅Π»ΠΎ лямбда-выраТСния Π½Π΅ осущСствляСт доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π²ΠΎ внСшнСй области видимости.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌΡ‹Π΅ Π² Ρ‚Π΅Π»Π΅ лямбда-выраТСния: ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ [&] всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΡΡΡ‹Π»Π°Π΅Ρ‚Π΅ΡΡŒ, Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС, Π° [=] Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. МоТно сначала ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ фиксации ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌ. НапримСр, Ссли Ρ‚Π΅Π»ΠΎ лямбда-выраТСния осущСствляСт доступ ΠΊ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ total ΠΏΠΎ ссылкС, Π° ΠΊ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ factor ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ прСдлоТСния фиксации эквивалСнтны:

ΠŸΡ€ΠΈ использовании записи ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ Π² Ρ‚Π΅Π»Π΅ лямбда-выраТСния.

Π—Π°Ρ…Π²Π°Ρ‚, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅, β€” это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ шаблона Variadic :

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-выраТСния Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π° класса, ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ this ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Capture, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ доступ ΠΊ функциям ΠΈ Ρ‡Π»Π΅Π½Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ класса.

Visual Studio 2017 вСрсии 15,3 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсий (доступно Π² /std: c++ 17): this ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ указания *this Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ capture. Π—Π°Ρ…Π²Π°Ρ‚ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ вСсь Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π²Ρ‹Π·ΠΎΠ²Π°, Π³Π΄Π΅ вызываСтся лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. (Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.) Π—Π°Ρ…Π²Π°Ρ‚ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° лямбда выполняСтся Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ»ΠΈ асинхронных опСрациях. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ NUMA.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ использованиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с функциями Ρ‡Π»Π΅Π½ΠΎΠ² класса, см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «ΠΏΡ€ΠΈΠΌΠ΅Ρ€: использованиС лямбда-выраТСния Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅» Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈ использовании прСдлоТСния Capture рСкомСндуСтся ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, особСнно ΠΏΡ€ΠΈ использовании лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ:

Π—Π°Ρ…Π²Π°Ρ‚Ρ‹ ссылок ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½Π΅, Π½ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚. ( mutable позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠΏΠΈΠΈ, Π½ΠΎ Π½Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Ρ‹.)

Π—Π°Ρ…Π²Π°Ρ‚ ссылок ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ обновлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½Π΅, Π½ΠΎ Π½Π΅ фиксируСт значСния.

Ѐиксация ссылки Π²Π²ΠΎΠ΄ΠΈΡ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сущСствования, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ фиксация значСния Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ зависимостями ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сущСствования. Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ асинхронном Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ лямбда-выраТСния. Если Π²Ρ‹ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎ ссылкС Π² асинхронном лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, это локально ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠΏΠ°Π»Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния лямбда-выраТСния. Код ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π² доступа Π²ΠΎ врСмя выполнСния.

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Π°Ρ фиксация (C++14)

Π’ C++14 Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ фиксации. Для этого Π½Π΅ трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сущСствовали Π²ΠΎ внСшнСй области видимости лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π° Π² качСствС любого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ выраТСния. Π’ΠΈΠΏ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ опрСдСляСтся Ρ‚ΠΈΠΏΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π­Ρ‚Π° функция позволяСт ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для пСрСмСщСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::unique_ptr ) ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ области ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Лямбда-выраТСния ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (лямбда-Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ Π² стандартном синтаксисС) являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ аспСктов Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ C++ 14, Ссли Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° являСтся ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ auto ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Π² качСствС спСцификатора Ρ‚ΠΈΠΏΠ°. Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ компилятору ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС шаблона. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр auto Π² спискС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² эквивалСнтСн ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ°.

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² качСствС своСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «Лямбда-выраТСния Π±ΠΎΠ»Π΅Π΅ высокого порядка» Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ИзмСняСмая спСцификация

БпСцификация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ спСцификации ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (throw).

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² качСствС своСго Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «Π»ΡΠΌΠ±Π΄Π°-выраТСния Π±ΠΎΠ»Π΅Π΅ высокого порядка» Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Π’Π΅Π»ΠΎ лямбды

Π’Π΅Π»ΠΎ лямбда-выраТСния являСтся составным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π² Ρ‚Π΅Π»Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°. Π’Π΅Π»ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ лямбда-выраТСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ доступ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

ЀиксированныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· внСшнСй области видимости (см. Π²Ρ‹ΡˆΠ΅).

Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π§Π»Π΅Π½Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… класса, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса ΠΈ this Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Π΅.

Π›ΡŽΠ±Π°Ρ пСрСмСнная, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ хранСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ содСрТится лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ явно фиксируСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ n ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈ нСявно фиксируСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ m ΠΏΠΎ ссылкС.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Generate.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ generate_n.

constexpr лямбда-выраТСния

Visual Studio 2017 вСрсии 15,3 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсий (доступно Π² /std:c++17 ): лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ constexpr (ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² константном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ), Ссли инициализация ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° Π² константном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ нСявно, constexpr Ссли Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ удовлСтворяСт трСбованиям constexpr Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для систСм ΠœΠ°ΠΉΠΊΡ€ΠΎΡΠΎΡ„Ρ‚

Visual Studio ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ c++ 11 ΠΈ лямбда-выраТСния Π±Π΅Π· отслСТивания состояния. Лямбда Π±Π΅Π· отслСТивания состояния прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ соглашСниС ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°Ρ….

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π”ΠΎΡ€ΠΎΠ³ΠΎΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ!

Π”Π΅Π»Π΅Π³Π°Ρ‚Ρ‹

Π”Π΅Π»Π΅Π³Π°Ρ‚ это особый Ρ‚ΠΈΠΏ. И ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΎΠ½ ΠΏΠΎ особому:

Π’ΡƒΡ‚ всС просто, Π΅ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово delegate, Π° дальшС сам Π΄Π΅Π»Π΅Π³Π°Ρ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ MyDelegate, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ int ΠΈ ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° string.

По Ρ„Π°ΠΊΡ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° Π² CIL β€” компилятор ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ-Π΄Π΅Π»Π΅Π³Π°Ρ‚ Π² ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ-класс ΠΈ всС экзСмпляры Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°-Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ ΡΠ²Π»ΡΡŽΡ‚ΡΡ экзСмплярами ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ²-классов. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ класс наслСдуСт Ρ‚ΠΈΠΏ MulticastDelegate ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΠΌΡƒ Π΄ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Combine ΠΈ Remove, содСрТит конструктор с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ target (Object) ΠΈ methodPtr (IntPtr), ΠΏΠΎΠ»Π΅ invocationList (Object), ΠΈ Ρ‚Ρ€ΠΈ собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Invoke, BeginInvoke, EndEnvoke.

Объявляя Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ-Π΄Π΅Π»Π΅Π³Π°Ρ‚ ΠΌΡ‹ сразу Ρ‡Π΅Ρ€Π΅Π· синтаксис Π΅Π³ΠΎ объявлСния ТСстко опрСдСляСм сигнатуру допустимых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ экзСмпляры Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°. Π­Ρ‚ΠΎ сразу влияСт Π½Π° сигнатуру Π°Π²Ρ‚ΠΎΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Invoke, BeginInvoke, EndEnvoke, поэтому эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°-Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

ЭкзСмпляр ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° стоит ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ссылку Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ список ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΡƒΠ΄Π° Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΈ скорСС всСго Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΡƒΠΆΠ΅ Π½Π° Ρ‚ΠΎΠΉ сторонС. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ смоТСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ (Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ этого Π΅ΠΌΡƒ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠΌ), ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ сигнатуру. Но ΠΎΠ½ смоТСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π΅Π»ΠΎ.

Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ бСзопасно для нашСго ΠΊΠΎΠ΄Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² Π΄Π΅Π»Π΅Π³Π°Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°.

Если ΠΏΠΎΡ„Π°Π½Ρ‚Π°Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² клиСнтской сторонС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠΌ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ нашСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π° этому Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Π΄Π΅Π»Π΅Π³Π°Ρ‚Π΅. НапримСр Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Боздавая Π² ΠΊΠΎΠ΄Π΅ экзСмпляр Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° Π΅Π³ΠΎ конструктору пСрСдаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ (ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ ΠΈ экзСмплярный ΠΈ статичСский, Π³Π»Π°Π²Π½ΠΎΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ сигнатура ΠΌΠ΅Ρ‚ΠΎΠ΄Π° совпадала с сигнатурой Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°). Если ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмплярный Ρ‚ΠΎ Π² ΠΏΠΎΠ»Π΅ target записываСтся ссылка Π½Π° экзСмпляр-Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ Π½Π°ΠΌ, вСдь Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмплярный Ρ‚ΠΎ это ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с полями этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° target), Π° Π² methodPtr ссылка Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄. Если ΠΌΠ΅Ρ‚ΠΎΠ΄ статичСский Ρ‚ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² поля target ΠΈ methodPtr Π±ΡƒΠ΄ΡƒΡ‚ записаны null ΠΈ ссылка Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ соотвСтствСнно.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· созданиС экзСмпляра Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°:

Или ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ синтаксис Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° конструктора:

ΠžΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ/ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ экзСмпляра Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π΅Π»Π΅Π³Π°Ρ‚ это Π² ΠΈΡ‚ΠΎΠ³Π΅ всСго лишь Ρ‚ΠΈΠΏ-класс, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ свободно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ поля, свойства, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ Ρ‚.Π΄. ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°.

Invoke β€” синхронноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² Π΄Π΅Π»Π΅Π³Π°Ρ‚Π΅.
BeginInvoke, EndEnvoke β€” Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π½ΠΎ асинхронноС.

Π’Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² хранящихся Π² Π΄Π΅Π»Π΅Π³Π°Ρ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ синтаксис:

это Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ записи:

А Π·Π°Ρ‡Π΅ΠΌ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρƒ ΠΏΠΎΠ»Π΅ invocationList?

ПолС invocationList ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null для экзСмпляра Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΏΠΎΠΊΠ° Π΄Π΅Π»Π΅Π³Π°Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ ссылку Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ всСгда ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ приравняв Ρ‡Π΅Ρ€Π΅Π· «=» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° (ΠΈΠ»ΠΈ сразу Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ синтаксис). Но Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»Π΅Π³Π°Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ ссылки Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄.
Для этого Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Combine:

ΠœΠ΅Ρ‚ΠΎΠ΄ Combine Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ‚ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ поля target ΠΈ methodPtr пусты, Π½ΠΎ invocationList, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄Π²Π΅ ссылки Π½Π° Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹: Ρ‚ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» Ρ€Π°Π½ΡŒΡˆΠ΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ first ΠΈ Ρ‚ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ хранится Π² second. Надо ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ² Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ Combine ΠΈ записав Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² first, Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π΅Ρ€Π½Π΅Ρ‚ ссылку Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ‚ с ΠΏΠΎΠ»Π΅ΠΌ invocationList Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ коллСкция ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ссылок, Π° Π΄Π΅Π»Π΅Π³Π°Ρ‚ с двумя ссылками Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ сборщиком мусора ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ†ΠΈΠΊΠ»Π΅ очистки.

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° всС Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если сигнатура Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ для всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ лишь Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго Π² спискС ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠœΠ΅Ρ‚ΠΎΠ΄ Remove ΠΆΠ΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ поиск Π² спискС Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, ΠΈ Π² случаС нахоТдСния удаляСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ совпавший.

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ для Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ += ΠΈ -= ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Combine ΠΈ Remove:

Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ записи:

Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ записи:

Π‘Ρ‚ΠΎΠΈΡ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ (Generic), Ρ‡Ρ‚ΠΎ являСтся Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ ΠΊ созданию ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².

Π’Π°ΠΊΠΆΠ΅ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° FCL ΡƒΠΆΠ΅ содСрТит Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярныС Ρ‚ΠΈΠΏΡ‹ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² (ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚). НапримСр Π΄Π΅Π»Π΅Π³Π°Ρ‚ Action прСдставляСт собой ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π½ΠΎ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π° Fucn ΠΈ с Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ.

Лямбда-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ лямбда-выраТСния

Π’Π°ΠΊ ΠΆΠ΅ экзСмпляр Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ лямбда-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ (lambda-operator) ΠΈΠ»ΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (lambda-expression). Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ†Π΅Π»ΠΎΠΌ это ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅, Ρ‚ΠΎ Π΄Π°Π»Π΅Π΅ ΠΏΠΎ тСксту я Π±ΡƒΠ΄Ρƒ ΠΈΡ… просто Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ «лямбды» Π² мСстах, Π³Π΄Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… различия.
Π‘Ρ‚ΠΎΠΈΡ‚ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Π² C# 3.0, Π° Π΄ΠΎ Π½ΠΈΡ… сущСствовали Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ появившиСся Π² C# 2.0.

ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚ΠΎΠΉ лямбд являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ =>, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»ΠΈΡ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π»Π΅Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΡ€Π°Π²ΡƒΡŽ с Ρ‚Π΅Π»ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Допустим Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π΅Π»Π΅Π³Π°Ρ‚:

Π’ΠΎΠ³Π΄Π° ΠΎΠ±Ρ‰ΠΈΠΉ синтаксис лямбда-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Лямбда-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ обрамляСм Π΅Π³ΠΎ Ρ‚Π΅Π»ΠΎ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, Ρ‡Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°:

ДопускаСтся Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², вСдь компилятор ΠΈ Ρ‚Π°ΠΊ Π·Π½Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΈ сигнатуру вашСго Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ для простоты чтСния ΠΊΠΎΠ΄Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ:

Π’ случаС Ссли имССтся лишь ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°ΠΌΠ»ΡΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ скобки:

Если Π² сигнатурС Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅Ρ‚ Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ пустыС скобки:

Если Ρ‚Π΅Π»ΠΎ лямбды состоит лишь ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ выраТСния, Ρ‚ΠΎ ΠΎΠ½ΠΎ являСтся Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ нас появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ синтаксис Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ:

β€” ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, ΠΎΠ±Ρ€Π°ΠΌΠ»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Π»ΠΎ лямбды;

β€” Π±Π΅Π· Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово return ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ Ρ‚ΠΎΡ‡ΠΊΡƒ запятой послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² Ρ‚Π΅Π»Π΅ лямбды:

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΊΠΎΠ΄ опрСдСлСния лямбды ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹ΠΌ:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Лямбда-исчислСниС

Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда. Π€ΠΎΡ‚ΠΎ Найти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° лямбда

А сСгодня Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ. Π― Π½Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ лямбда-исчислСниС являСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Π·Π½Π°Π½ΠΈΠ΅ΠΌ для любого программиста. Однако, Ссли Π²Π°ΠΌ нравится Π΄ΠΎΠΊΠ°ΠΏΡ‹Π²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ истоков, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π° Ρ‡Π΅ΠΌ основаны ΠΌΠ½ΠΎΠ³ΠΈΠ΅ языки программирования, Π²Ρ‹ Π»ΡŽΠ±ΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΈ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ всС Π² этом ΠΌΠΈΡ€Π΅ ΠΈΠ»ΠΈ просто Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π°Ρ‚ΡŒ экзамСн ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, я), Ρ‚ΠΎ этот пост для вас.

Π§Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅

Но Ρ€Π΅Ρ‡ΡŒ сСгодня Π½Π΅ ΠΎ SQL, Π° ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языках. ИмСнно для Π½ΠΈΡ… лямбда-исчислСниС являСтся основой. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ популярны, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ свою Π½ΠΈΡˆΡƒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ΄Π΅ΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования ΠΈ лямда-исчислСния постСпСнно ΠΏΡ€ΠΎΠΊΡ€Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки, ΠΏΠΎΠ΄ Π²ΠΈΠ΄ΠΎΠΌ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΠΈΡ‡.

Если Π²Ρ‹ ΠΈΠ·ΡƒΡ‡Π°Π»ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ языки, Ρ‚ΠΎ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚Π°ΠΊΠΎΠΌ понятии ΠΊΠ°ΠΊ Машина Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π°. Π­Ρ‚Π° Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ абстракция опрСдСляСт класс вычислимых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π­Ρ‚ΠΎΡ‚ класс ΡΡ‚ΠΎΠ»ΡŒ Π²Π°ΠΆΠ΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎ тСзису Π§Π΅Ρ€Ρ‡Π° ΠΎΠ½ эквивалСнтСн ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π»ΡŽΠ±ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ устройствС, ΠΌΠΎΠΆΠ½ΠΎ воспроизвСсти ΠΈ Π½Π° машинС Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π°. А для нас Π³Π»Π°Π²Π½ΠΎΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ лямбда-исчислСниС ΠΏΠΎ мощности эквивалСнтно машинС Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π° ΠΈ опрСдСляСт этот ΠΆΠ΅ класс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ создатСлСм лямбда-исчислСния являСтся Ρ‚ΠΎΡ‚ самый Алонзо Π§Π΅Ρ€Ρ‡!

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ понятия

Π’ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ лямбда-исчислСния Π΅ΡΡ‚ΡŒ всСго Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

Π‘Ρ€Π°Π·Ρƒ ΠΏΠ°Ρ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

БоглашСния

НСсколько соглашСний для понимания, Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ выраТСния:

ΠžΠ±Π»Π°ΡΡ‚ΠΈ видимости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ контСкст ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована. Абстракция ` lambda x.E ` связываСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ` x `. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ понятия:

ВычислСниС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

ВычислСниС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ подстановок. ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΎΠΉ ` E’ ` вмСсто ` x ` Π² ` E \ ` (запись: ` [E’//x]E ` ) называСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… шагов:

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Как Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ называСтся ΠΊΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π² Ρ‡Π΅ΡΡ‚ΡŒ Π₯аскСлла ΠšΠ°Ρ€Ρ€ΠΈ Π½Π°Π·Π²Π°Π»ΠΈ ΠΈ язык программирования, ΠΈ эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ), Π° функция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, называСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ вычислСний

Π‘Ρ‹Π²Π°ΡŽΡ‚ ситуации, ΠΊΠΎΠ³Π΄Π° произвСсти вычислСниС ΠΌΠΎΠΆΠ½ΠΎ нСсколькими способами. НапримСр, Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ` (lambda y. (lambda x. x) y) E ` сначала ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ` y ` вмСсто ` x ` Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ ` E ` вмСсто ` y ` Π²ΠΎ внСшнСС. Π’Π΅ΠΎΡ€Π΅ΠΌΠ° Π§Π΅Ρ€Ρ‡Π°-РассСра Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ зависимости ΠΎΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ссли вычислСниС Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, эти Π΄Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ. Рассмотрим ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²

Π’ чистом лямбда-исчислСнии Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Однако, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±Π΅Π· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. ИдСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Аналогично, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-исчислСния ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ конструкции языков программирования, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ†ΠΈΠΊΠ»Ρ‹, вСтвлСния, списки ΠΈ Ρ‚Π΄.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *