Lambda ifodalari misollar bilan. Yuqori darajadagi funktsiyalar va lambdalar


Natija: vektor v lambda bilangener_n() ga qo'ng'iroq qilgandan keyin: 1 1 2 3 5 8 13 21 34


Download 37.33 Kb.
bet9/17
Sana25.10.2023
Hajmi37.33 Kb.
#1720034
1   ...   5   6   7   8   9   10   11   12   ...   17
Bog'liq
Lambda ifodalari misollar bilan

Natija:
vektor v lambda bilangener_n() ga qo'ng'iroq qilgandan keyin: 1 1 2 3 5 8 13 21 34
x: 1 y: 1
fillVector() ga birinchi qo'ng'iroqdan keyin vektor v: 1 2 3 4 5 6 7 8 9
vektor v fillVector() ga ikkinchi chaqiruvdan keyin: 10 11 12 13 14 15 16 17 18 Qo'shimcha ma'lumot olish uchun bo'limga qarang.
Lambda ifodalari quyidagi CLR boshqariladigan ob'ektlarda qo'llab-quvvatlanmaydi: ref klassi , ref struct , qiymat sinfi va qiymat tuzilishi .
Agar siz Microsoft tizimlariga xos bo'lgan modifikatorlardan foydalansangiz, masalan, lambda ifodasiga parametr-deklaratsiya-bandidan so'ng darhol kiritishingiz mumkin, masalan:
Ixtiyoriy parametr atribut-spesifikator-seq ushbu versiyada qo'llab-quvvatlanmaydi.
Visual Studio C++ 11 lambda ifodasi xususiyatlariga qo'shimcha ravishda quyidagi xususiyatlarni o'z ichiga oladi:
Fuqaroligi bo'lmagan lambda iboralari ixtiyoriy chaqiruv konventsiyalari bilan funksiya ko'rsatkichlariga universal tarzda aylantiriladi.
( Qaytish ifodasi; ) dan murakkabroq bo'lgan lambda iboralari tanasi uchun avtomatik ravishda chiqarilgan qaytarish turlari, agar barcha qaytarish ifodalari bir xil bo'lsa. (Bu xususiyat tavsiya etilgan C++14 standartining bir qismidir.)
Displey:
Yuqori darajali funktsiya - kirish argumenti sifatida boshqa funktsiyani qabul qiladigan yoki uning qaytish natijasi sifatida funksiyaga ega bo'lgan funksiya. Bunday funktsiyaning yaxshi namunasi lock() dir, u qulflangan ob'ekt va funktsiyani oladi, qulfni qo'llaydi, funktsiyani bajaradi va qulfni chiqaradi:
Qiziqarli qulf(qulf: Qulf, korpus: () -> T): T( lock.lock() urinib ko'ring( tanani qaytaring() ) nihoyat ( lock.unlock() ) )
Keling, ushbu blokni tahlil qilaylik. Tana parametri funksiya turiga mansub: () -> T , ya'ni u hech qanday kirish argumentlarini olmaydigan va T tipidagi qiymatni qaytaradigan funksiya deb taxmin qilinadi. U lock bilan himoyalangan try bloki ichida chaqiriladi va uning natijasi lock() funksiyasi tomonidan qaytariladi.
Fun toBeSynchronized() = sharedResource.operation() val natija = qulflash (qulflash, ::toBeSynchronized)
Lambda ifodasini ishlatishning yana bir qulay usuli:
Val natijasi = qulflash (qulflash, ( sharedResource.operation() ))
Lambda iboralari batafsilroq tavsiflangan, ammo ushbu bo'limni davom ettirish uchun qisqacha ko'rib chiqamiz:

  • Lambda ifodalari har doim jingalak qavslar ichiga olinadi,

  • Ushbu ifodaning parametrlari (agar mavjud bo'lsa) -> belgisidan oldin e'lon qilinadi (parametrlarni o'tkazib yuborish mumkin),

  • Ifodaning tanasi -> belgisidan keyin keladi.

Kotlinda shunday konventsiya mavjudki, agar funktsiyaning oxirgi parametri funksiya bo'lsa va siz argument sifatida lambda ifodasidan foydalansangiz, uni qavslar tashqarisida ko'rsatishingiz mumkin:
Bloklash (qulflash) ( sharedResource.operation() )
Yuqori tartibli funksiyaning yana bir misoli map() funksiyasi:
Qiziqarli Roʻyxat .map (transformatsiya qilish: (T) -> R): Ro'yxat (val natija = arrayListOf () uchun (bu element) result.add(transform(element)) natijani qaytarish )
Ushbu funktsiyani quyidagicha chaqirish mumkin:
Val ikki barobar = ints.map ( it -> it * 2 )
E'tibor bering, funktsiyani chaqirishda parametrlarni e'tiborsiz qoldirish mumkin, agar lambda uni chaqirish uchun yagona argument bo'lsa.

Download 37.33 Kb.

Do'stlaringiz bilan baham:
1   ...   5   6   7   8   9   10   11   12   ...   17




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling