Lua skriptlari nima? Lua dasturlash tili. Lua qanday ma'lumot turlarini qo'llab-quvvatlaydi

Men sentimental dasturchiman. Ba'zan dasturlash tillarini sevib qolaman, keyin ular haqida soatlab gaplashishim mumkin. Men ushbu soatlarning birini siz bilan baham ko'raman.

Lua? Nima bu?

Lua - oddiy ko'miladigan til (u boshqa tillarda yozilgan dasturlaringiz bilan birlashtirilishi mumkin), engil va sodda, bitta ma'lumot turi bilan, bir xil sintaksisga ega. O'rganish uchun mukammal til.

Nima uchun?

Lua sizga yordam berishi mumkin:

* agar siz geymer bo'lsangiz (World of Warcraft va boshqa ko'plab o'yinlar uchun plaginlar)
* agar siz o'yinlar yozsangiz (ko'pincha o'yinlarda dvigatel C / C ++ da, AI esa Lua-da yoziladi)
* agar siz tizim dasturchisisiz (Lua da nmap, wireshark, nginx va boshqa yordam dasturlari uchun plaginlarni yozishingiz mumkin)
* agar siz ichki ishlab chiquvchi bo'lsangiz (Lua juda tezkor, ixcham va juda kam resurslarni talab qiladi)

1. Dasturlashni o'rganing. Hech bo'lmaganda ozgina. Qaysi tilda bo'lishining ahamiyati yo'q.
2. Lua-ni o'rnating. Buning uchun 5.2 versiyasini bu yerdan yuklab oling (http://www.lua.org/download.html) yoki uni omborlardan qidirib toping. 5.1 versiyasi ham ishlaydi, lekin uning juda eski ekanligini unutmang.

Maqoladagi barcha misollarni terminalda "lua file.lua" kabi buyruq bilan ishlating.

Birinchi taassurotlar

Lua - bu dinamik ravishda terilgan til (o'zgaruvchilar belgilangan qiymatlarga qarab "tezda" turlarini olishadi). Unda siz ham imperativ, ham ob'ektga yo'naltirilgan yoki funktsional uslubda yozishingiz mumkin (hatto bu qandayligini bilmasangiz ham - ahamiyatsiz, o'qishni davom eting). Mana Lua shahridagi salom dunyo:

Mening birinchi lua dasturim: salom.lua chop etish "salom dunyo"; chop etish ("xayr olam")

Til haqida allaqachon nima deyish mumkin:

* bitta satrdagi izohlar ikkita defis bilan boshlanadi "-"
* qavslar va vergullarni olib tashlash mumkin

Til operatorlari

Shartlar va tsikllar to'plami juda odatiy:

Agar shartli so'zlar (boshqa filiallar bo'lmasligi mumkin), agar a \u003d\u003d 0 bo'lsa ("a nolga teng") else print ("a nolga teng emas") oxiri - qisqartirilgan shakli if / elseif / end (switch / case o'rniga) a \u003d\u003d 0 bo'lsa print ("zero") elseif a \u003d\u003d 1 then print ("one") elseif a \u003d\u003d 2 then print ("two") else print ("other") i \u003d uchun oxirgi qarshi tsikl 1, 10 oldindan shartli b (5) shartli print (i) ni bajaring, b\u003e 0 b \u003d b - 1 tugmachadan keyingi shart bilan b \u003d b + 1 ni b\u003e \u003d 5 gacha takrorlang

O'YLANING: "for i \u003d 1, 10, 2 do ... end" tugmachasi nimani anglatishi mumkin?

Ifodalarda o'zgaruvchilar bo'yicha quyidagi operatorlardan foydalanishingiz mumkin:

* topshiriq: x \u003d 0
* arifmetik: +, -, *, /,% (modulo), ^ (daraja)
* boolean: va, yoki, emas
* taqqoslash:\u003e,<, ==, <=, >\u003d, ~ \u003d (teng emas, ha-ha, odatdagi o'rniga "! \u003d")
* mag'lubiyatni birlashtirish (operator ".."), masalan: s1 \u003d "salom"; s2 \u003d "dunyo"; s3 \u003d s1..s2
* uzunlik / o'lcham (operator #): s \u003d "salom"; a \u003d #s ('a' 5 bo'ladi).
* elementni indeks bo'yicha olish, masalan: s

Uzoq vaqt davomida tilda bitli operatsiyalar bo'lmagan, ammo 5.2 versiyada bit32 kutubxonasi paydo bo'ldi, bu ularni amalga oshiradi (operator sifatida emas, funktsiya sifatida).

Ma'lumot turlari

Til bitta ma'lumot turiga ega deb aytganimda, sizga yolg'on gapirdim. U juda ko'p (har bir jiddiy til kabi):

* nil (umuman hech narsa)
* mantiqiy raqamlar (true / false)
* raqamlar (raqamlar) - butun sonlarga bo'linish yo'q / real. Faqat raqamlar.
* satrlar - aytmoqchi, ular paskal tilidagi satrlarga juda o'xshash
* funktsiyalar - ha, o'zgaruvchi "funktsiya" turiga kirishi mumkin
* ip
* o'zboshimchalik bilan ma'lumotlar (userdata)
* jadval

Agar birinchi turlarda hamma narsa aniq bo'lsa, unda userdata nima? Lua ko'miladigan til ekanligini va odatda boshqa tillarda yozilgan dasturlarning tarkibiy qismlari bilan yaqindan ishlashini unutmang. Shunday qilib, ushbu "begona" komponentlar o'z ehtiyojlariga ko'ra ma'lumotlarni yaratishi va ushbu ma'lumotlarni lua ob'ektlari bilan birgalikda saqlashi mumkin. Shunday qilib, userdata - bu aysbergning suv osti qismi, bu lua tili nuqtai nazaridan kerak emas, lekin biz shunchaki uni e'tiborsiz qoldirolmaymiz.

Va endi tilda eng muhim narsa jadvallardir.

Jadvallar

Tilda 8 ta ma'lumotlar turi bor deb aytganimda yana yolg'on gapirdim. Siz u bitta deb taxmin qilishingiz mumkin: barchasi jadvallar (aytmoqchi, bu ham to'g'ri emas). Jadval juda nafis ma'lumotlar tuzilmasi bo'lib, u massiv, xesh jadvali ("kalit" - "qiymat"), struktura, ob'ekt xususiyatlarini birlashtiradi.

Shunday qilib, bu erda jadvalga massiv sifatida misol keltirilgan: a \u003d (1, 2, 3) - 3 elementdan iborat massiv (a) - "2" chiqadi, chunki indekslar bittadan hisoblanadi - Jadval a siyrak massiv (unda barcha elementlar mavjud emas) a \u003d () - bo'sh jadval a \u003d 1 a \u003d 5

O'ylang: siyrak massiv uchun nima degani?

Yuqoridagi misolda jadval o'zini massiv kabi tutadi, lekin aslida bizda kalitlar (indekslar) va qiymatlar (qator elementlari) mavjud. Va shu bilan birga, tugmachalar nafaqat raqamlar, balki har qanday turdagi bo'lishi mumkin:

A \u003d () a ["salom"] \u003d rost a ["dunyo"] \u003d yolg'on a \u003d 1 - yoki shunga o'xshash: a \u003d (salom \u003d 123, dunyo \u003d 456) chop etish (a ["salom")) chop etish ( a.hello) xuddi ["salom"] bilan bir xil, garchi u maydonlari bor tuzilishga o'xshasa

Aytgancha, jadvalda kalitlar va qiymatlar mavjud bo'lganligi sababli, siz barcha tugmachalarni va ularga tegishli qiymatlarni tsiklda aylana olasiz:

T \u003d (a \u003d 3, b \u003d 4) tugmachasi, juftlikdagi qiymat (t) bosmadan chiqadi (tugma, qiymat) - "a 3" ni, so'ng "b 4" ni tugatadi

Ob'ektlar haqida nima deyish mumkin? Biz ular haqida birozdan keyin bilib olamiz, avval - funktsiyalar haqida.

Vazifalar

Bu erda umumiy funktsiyaga misol keltirilgan.

Qo'shish (a, b) funktsiyasi a + b tugashini qaytaradi (qo'shing (5, 3)) - "8" ni chiqaradi

Til funktsiyalari bir nechta argumentlarni qabul qilishga va bir nechta argumentlarni qaytarishga imkon beradi. Masalan, aniq ko'rsatilmagan argumentlar nol deb qabul qilinadi.

O'YLANING: Nega bir nechta dalillarni qaytarishni xohlaysiz?

Vaziyatni almashtirish (a, b) qaytish b, tugatish x, y \u003d almashtirish (x, y) - aytmoqchi, buni funktsiyasiz bajarish mumkin: x, y \u003d y, x - va agar funktsiya bir nechta argumentlarni qaytarsa , - va sizga kerak emas - ularga e'tibor bermang - "_" a, _, _, d \u003d some_function ()

Funktsiyalar o'zgaruvchan sonli argumentlarni qabul qilishi mumkin:

Prototipda o'zgaruvchan miqdordagi argumentlar ellips funktsiyasi sifatida yig'iladi (...) s \u003d 0 uchun _, n juftlikda (arg) do - funktsiyasida ular "arg" s \u003d s jadvali deb nomlanadi. + n oxiri yakuniy summani qaytaradi (1, 2, 3) - 6 sumni qaytaradi (1, 2, 3, 4) - 10 ni qaytaradi

Funktsiyalar to'liq ma'lumot turi bo'lgani uchun siz funktsiyalar o'zgaruvchilarini yaratishingiz yoki funktsiyalarni boshqa funktsiyalarga argument sifatida berishingiz mumkin

A \u003d funktsiya (x) qaytish x * 2 uchi - 2 ga ko'paytiriladigan funktsiya b \u003d funktsiya (x) qaytish x + 1 uchi - 1 funktsiyaga ko'payadigan funktsiya qo'llaniladi (jadval, f) natija \u003d () uchun k, v in juftliklar (jadval) natija beradi [k] \u003d f (v) - elementni ushbu elementning oxirigacha ba'zi funktsiyalar bilan almashtiring - O'YLANING: t \u003d (1, 3, 5) chaqiradigan narsa qaytadi amal qiladi (t, a) amal qiladi ( t, b)

Ob'ektlar \u003d funktsiyalar + jadvallar

Funktsiyalarni o'zgaruvchiga saqlashimiz mumkin bo'lganligi sababli, jadval maydonlarida ham foydalanishimiz mumkin. Va bu allaqachon usullar kabi paydo bo'ldi. OOP bilan tanish bo'lmaganlar uchun aytamanki, uning asosiy foydasi (hech bo'lmaganda Lua-da) ular ishlaydigan funktsiyalar va ma'lumotlar yonma-yon joylashgan - bitta ob'ekt ichida. OOP bilan tanish bo'lganlar uchun men aytamanki, bu erda darslar yo'q, lekin meros prototipikdir.

Keling, misollarga o'tamiz. Bizda ob'ekt bor, masalan, lampochka. U kuyishni va kuymaslikni biladi. Xo'sh, siz ikkita amalni bajarishingiz mumkin - uni yoqing va o'chiring:

Chiroq \u003d (yoqilgan \u003d yolg'on) funksiya turn_on (l) l.on \u003d haqiqiy tugatish funktsiyasi turn_off (l) l.on \u003d false end bu faqat struktura bilan ishlash uchun funktsiyalardir turn_on (lamp) turn_off (lamp)

Agar biz lampochkani ob'ektga aylantirsak va turn_off va turn_on funktsiyalarini ob'ekt maydonlariga aylantirsak, biz quyidagilarni olamiz:

Chiroq \u003d (yoqilgan \u003d soxta burilish_on \u003d funktsiya (l) l.on \u003d haqiqiy oxirigacha o'chirish \u003d funktsiya (l) l.on \u003d soxta tugma) chiroq. Burilish_on (chiroq) chiroq.turn_off (chiroq)

Biz birinchi dalil sifatida lampochkaning ob'ektidan o'tishga majbur bo'lamiz, chunki aks holda bizning funktsiyamiz yoqish / o'chirish holatini o'zgartirish uchun qaysi lampochka bilan ishlash kerakligini bilmaydi. Ammo so'zma-so'z bo'lmasligi uchun Lua odatda stenografiyaga ega - chiroq: turn_on (). Umuman olganda, biz allaqachon bir nechta bunday sintaksis soddalashtirilganligini bilamiz:

Chiroq: turn_on () - eng keng tarqalgan yozuv lampa.turn_on (chiroq) - sintaksis nuqtai nazaridan, bu ham to'g'ri chiroq ["turn_on"] (chiroq) - va bu

Qisqartmalar haqida gapirishni davom ettirib, funktsiyalarni nafaqat strukturaning maydonlari sifatida, balki qulayroq shaklda ham tasvirlash mumkin:

Lamp \u003d (on \u003d false) - nuqta orqali, keyin argument funktsiya ko'rsatilishi kerak lamp.turn_on (l) l.on \u003d true end - niqtali nuqta, keyin argument noaniq ravishda "self" - "self" o'zgaruvchisi sifatida o'rnatiladi "- va u erda funktsiya chirog'i deb nomlangan chiroq mavjud: turn_off () self.on \u003d false end

Qiziqmi?

Maxsus funktsiyalar

Ba'zi jadval funktsiyalari (uslublari) nomlari saqlanib qolgan va alohida ma'noga ega:

* __add (a, b), __sub (a, b), __div (a, b), __mul (a, b), __mod (a, b), __pow (a, b) - arifmetik amallar bajarilganda chaqiriladi. stol
* __unm (a) - unary minus operatsiyasi (ular "x \u003d -x" kabi bir narsa yozganda)
* __lt (a, b), __le (a, b), __eq (a, b) - taqqoslash natijasini hisoblang (<, <=, ==)
* __len (a) - "#a" tugashi bilan chaqiriladi
* __concat (a, b) - "a..b" bo'lganda chaqiriladi
* __call (a, ...) - "a ()" bo'lganda chaqiriladi. O'zgaruvchan argumentlar chaqirilganda argumentlardir
* __index (a, i) - agar bunday element bo'lmasa, [i] ga qo'ng'iroq qilish
* __newindex (a, i, v) - "a [i] \u003d v" yaratish
* __gc (a) - ob'ekt axlat yig'ish yo'li bilan chiqarilganda

Ushbu usullarni almashtirish orqali siz operatorlarni haddan tashqari yuklashingiz va til sintaksisidan o'z maqsadlaringiz uchun foydalanishingiz mumkin. Asosiysi, uni haddan tashqari ko'tarmaslik.

Meros olish

OOP ni bilmaganlar uchun meros allaqachon mavjud bo'lgan sinfning funksiyasini kengaytirishga imkon beradi. Masalan, shunchaki lampochka yoqilishi va o'chishi mumkin, shuningdek super lampa ham uning yorug'ligini o'zgartiradi. Nega biz turn_on / turn_off usullarini qayta ishlatamiz, ularni qayta yozamiz?

Lua bu uchun meta jadval tushunchasiga ega, ya'ni. ajdodlar jadvallari. Har bir jadvalda bitta ota-ona jadvali mavjud va bolalar jadvali ota-onasi qila oladigan hamma narsani bajarishi mumkin.

Aytaylik, biz allaqachon chiroq stolini yaratdik. Keyin super lampa shunday bo'ladi:

Superlamp \u003d (nashrida \u003d 100) - biz ota-jadvalni belgilanadigan (superlamp, lampa) jadvalini aniqlaymiz - va uning usullari endi mavjud superlamp: turn_on () superlamp: turn_off ()

Funktsional imkoniyatlarni kengaytirish

Ota-onalar jadvallari juda ko'p turlarga ega (yaxshi, qatorlar va jadvallar, aniqrog'i raqamlar va mantiqiy qiymatlar, nol yo'q). Deylik, barcha qatorlarni ".." emas, "+" operatori yordamida qo'shmoqchimiz. Buning uchun barcha qatorlarning ota-jadvallari uchun "+" (__add) funktsiyasini almashtiring:

S \u003d getmetatable ("") - s satrning ota-jadvalini oldi .__ add \u003d function (s1, s2) return s1..s2 end - usulni o'zgartirdi - a \u003d "salom" b \u003d "dunyo" ni bosib chiqarishni tekshiring ( a + b) - "helloworld" yozadi

Aslida, biz chop etish funktsiyasini "print \u003d myfunction" bilan almashtirishimiz mumkin va boshqa ko'plab xakerliklarni amalga oshirish mumkin.

Qamrov doiralari

O'zgaruvchilar global va mahalliydir. Yaratilgandan so'ng, Luadagi barcha o'zgaruvchilar global hisoblanadi.

O'YLANING: nega?

Mahalliy ko'lamini ko'rsatish uchun mahalliy kalit so'zni yozing:

Mahalliy x mahalliy var1, var2 \u003d 5, 3

Ushbu so'z haqida unutmang.

Qayta ishlashda xatolik yuz berdi

Ko'pincha, xatolar yuzaga kelsa, ma'lum bir funktsiyani bajarishni to'xtatishingiz kerak. Siz, albatta, juda ko'p tekshiruvlarni amalga oshirishingiz va agar biror narsa noto'g'ri bo'lsa, "qaytish" ga qo'ng'iroq qilishingiz mumkin. Ammo bu kod miqdorini oshiradi. Lua istisnolar kabi narsalardan foydalanadi.

Xatolar (x) funktsiyasi yordamida tashlanadi. Har qanday narsani argument sifatida qabul qilish mumkin (xato bilan bog'liq bo'lgan narsa - mag'lubiyat tavsifi, raqamli kod, xato sodir bo'lgan ob'ekt va boshqalar).

Odatda, ushbu funktsiyadan so'ng, butun dastur ishdan chiqadi. Va bu har doim ham zarur emas. Agar siz xatoga yo'l qo'yadigan funktsiyani chaqirsangiz (yoki uning asosiy funktsiyalari xatoga yo'l qo'yishi mumkin bo'lsa), uni pcall () bilan xavfsiz tarzda chaqiring:

Funktsiya f (x, y) ... agar ... keyin xato ("biron bir narsa qila olmadi") tugaydi ... tugaydi holati, err \u003d pcall (f, x, y) - f: function, xy: uning argumentlari agar vaziyat bo'lmasa, xato xato. Bizning holatda, xato xato matnining oxirini o'z ichiga oladi

Standart kutubxonalar

Ko'pgina nostandart kutubxonalar mavjud, ularni LuaForge, LuaRocks va boshqa omborlarda topishingiz mumkin.

Lua va Lua bo'lmaganlar o'rtasida

Agar standart kutubxonalarning faoliyati biz uchun etarli bo'lmasa-chi? Agar bizda C dasturimiz bo'lsa va biz uning funktsiyalarini Lua-dan chaqirishni xohlasak? Buning uchun juda oddiy mexanizm mavjud.

Tasodifiy sonni qaytaradigan o'z funktsiyamizni yaratishni xohlaymiz deylik (Lua math.random () ga ega, ammo biz o'rganishni xohlaymiz). Biz quyidagi kodni C ga yozishimiz kerak bo'ladi:

# shu jumladan # shu jumladan # shu jumladan / * aslida "rand (from, to)" * / static int librand_rand (lua_State * L) (int from, to; int x; from \u003d lua_tonumber (L, 1); / * chaqirganda nima qilish kerak; / * ning birinchi parametri function * / to \u003d lua_tonumber (L, 2); / * funktsiyasining ikkinchi parametri * / x \u003d rand ()% (dan - dan + 1) + dan; lua_pushnumber (L, x); / * qaytish qiymati * / return 1; / * Lua "rand" dagi bitta argumentni qaytarish * /) / * bizning librand_rand () funktsiyamizga mos keladi * / static const luaL_reg R \u003d (("rand", librand_rand), (NULL, NULL) / * end eksport qilinadigan funktsiyalar ro'yxati * /); / * kutubxona yuklanganda chaqiriladi * / LUALIB_API int luaopen_librand (lua_State * L) (luaL_openlib (L, "librand", R, 0); srand (vaqt (NULL)); qaytish 1; / * muvaffaqiyat * /)

O'sha. Lua bizga ma'lumotlar turlari bilan ishlash, funktsiya argumentlarini qabul qilish va natijalarni qaytarish uchun funktsiyalarni taqdim etadi. Funktsiyalar juda oz. Endi biz kutubxonamizni dinamik kutubxona sifatida qurmoqdamiz va biz rand () funktsiyasidan foydalanishimiz mumkin:

Tasodifiy \u003d talab qilish ("librand") - kutubxonani bosib chiqarish (random.rand (1, 100)) chop etish (random.rand (0, 1))

Agar biz dasturlarimizdan Lua kodiga qo'ng'iroq qilmoqchi bo'lsak nima bo'ladi? Keyin bizning dasturlarimiz Lua skriptlari bajariladigan Lua virtual mashinasini yaratishi kerak. Bu juda oson:

#include "lua.h" #include "lauxlib.h" int main () (lua_State * L \u003d lua_open (); // Lua virtual mashinasini yaratish luaL_openlibs (L); // standart kutubxonani yuklash luaL_dofile (L, " rand. lua "); // skriptni bajaring lua_close (L); // yopish Lua qaytish 0;)

Hammasi.

Endi siz Luada yozishingiz mumkin. Agar siz Lua haqida maqolada aks etishi mumkin bo'lgan qiziqarli fikrlarni topsangiz - yozing!

LUÁ, iau, vb. I. tranz. I. 1. A prinde un obiect în mână spre a l ţine (shi a se servi de el) sau spre a l pune în altă parte. ♢ expr. A lua altă vorbă \u003d schimba (cu dibăcie) subiectul unei discuţii. A (shi) lua picioarele la spinare \u003d a pleca ... ... Dicționar Român

Lua - Asosiy paradigmenlar logotipi: Skriptsprache, imperativ, funktional, objektorientiert ... Deutsch Wikipedia

Lua - [] Información general Paradigma Multiparadigma: interpretado, imperativo, funktsional, orientado a objetos, basado and prototipos Apareció en… Vikipediya ispancha

LUA - Apparu en 1993 Auteur Luiz Henrique de Figueiredo, Roberto Ierusalimschy va Waldemar Celes Implémentations Lua, LuaJIT, LLVM Lua, LuaCLR, Nua, Lua A ... Vikipediya va Frantsiya

LUA - (Portugiesisch für Mond) Dasturda Eynbinden-dan Skriptsprache-ni xohlaysiz, lekin biz sizning hayotimizga qo'shilamiz. Eine der besonderen Eigenschaften von Lua, Größe des kompilierten skript tarjimonlari uchun o'ladi. Lua wurde …… Deutsch Vikipediya

lua - lar. f. 1. Ey Terra sayyorasi satélite. 2. Tempo compreendido entre dois novilúnios. 3. Mês. 4. Cio. 5.O mesmo que peixe lua. 6. Disco de ouro ou prata que os Timores usam ao pescoço, como símbolo de ... ... Dicionário da Língua Portuguesa

Lua - quyidagilarga murojaat qilishi mumkin: * Lua (dasturlash tili), engil, kengaytiriladigan dasturlash tili * Lua (Yu Gi Oh! 5D s) * Lua (ma'buda), Rim ma'budasi * Lua (jang san'ati), Gavayi an'anaviy jang san'ati * Lua (qo'shiq), folklor tomonidan yaratilgan bitta ... ... Vikipediya

LUA qisqartmasi: LUA so'nggi umumiy ajdod (shuningdek "So'nggi universal ajdod" deb tarjima qilingan (inglizcha LUA, So'nggi universal ajdod), aks holda LUCA, so'nggi universal umumiy ... Vikipediya

lua - (Del gót. Lôfa, palma de la mano). 1.f. Especie de guante hecho de esparto y sin separaciones para los dedos, que sirve para limpiar las caballerías. 2. mart. Revés de las velas por la parte donde van cazadas con viento largo o en popa. 3. Mart ... ... Diccionario de la lengua española

Lua - Lua, römische Göttin, Tochter des Saturnus, Welcher nach der Schlacht zur Sühne des vergossenen Blutes erbeutete Waffen von dem Feldherrn verbrannt wurden ... Pierer's Universal-Lexikon

LUA - Dea quaedam apud vett, luendo, expiandoque nomen sortita, que praeerat lustustibus, and lustris. Videoni Turneb. Adver s. l. 16.c. 20. va boshqalar. 23. v. 23. et l. 19.c. 11. Eius A. Gellni eslaydi. l. 13.c. 22. Sacerdotum Pop kutubxonalarida. Rom… Hofmann J. Lexicon universalale

Kitoblar

  • Lua dasturlash
  • Lua dasturlash. Qo'llanma, Jeruzalimski Robert. Kitob eng mashhur ko'milgan tillardan biri - Lua tiliga bag'ishlangan. Ushbu til ko'plab o'yinlarda va turli xil dasturlarda ishlatilgan. Til kichik hajmni birlashtiradi ...

Kirish

Ushbu qo'llanma LUA bilan ishlash tajribasi cheklanganlar uchun mo'ljallangan. Qanday qilib kodni echish kerakligi, siz uchun yanada murakkab kod yaratish uchun qurilish bloklari va ba'zi misollarni keltiramiz. Qo'llanma amalda darhol qo'llaniladigan tarzda yozilgan. Shuning uchun siz Stol usti simulyatorini va LUA muharririni kuzatib borish uchun ochishingiz kerak.

Bu ushbu ketma-ketlikdagi birinchi o'quv qo'llanma. Ikkinchisi - Lua More-ni o'rganish. Uchinchisi - "Lua funktsiyalarini o'rganish" deb nomlangan foydali funktsiyalar to'plami.

Birinchi tugmani bosishdan oldin

Birinchidan, agar siz Tabletop Simulator-ga skript yozmoqchi bo'lsangiz, Atom-ni o'rnatishni tavsiya etaman. U qanday funktsiyalardan foydalanish mumkinligini biladi va TTS-ga / kodni import / eksport qiladi.

Keyin xatcho'plarga qo'shishingiz kerak. O'zingizning stsenariylaringizni yozishni boshlaganingizdan so'ng, ushbu saytga tez-tez bog'lanasiz. Bu erda siz "Tabletop Simulator" da maxsus xususiyatlarni va ularning ishlashini topasiz. Hech bo'lmaganda mening tajribamga ko'ra siz ko'pincha API va Ob'ekt sahifalaridan foydalanasiz.

O'qitish

O'zingizning stsenariylaringizni Tabletop-ga saqlaganingizda, u sizning oxirgi saqlashingizdan foydalanadi va keyin unga skriptlarni yuklaydi. Shuning uchun siz yozmoqchi bo'lgan har qanday skript uchun siz quyidagilarni bajarishingiz kerak bo'ladi:

  • Stolni xohlagancha tayyorlang.
  • Jadvalni saqlang.
  • Jadvalni yuklang.
Ushbu mashq uchun bo'sh jadvalni oling va ikkita ob'ekt yarating (men kvadrat blok va to'rtburchaklar blokdan foydalanganman) va qizil tekshirgich.

Qayta bosing, chunki albatta olasiz.

Qo'shimcha kredit: Jadvallarni yaratishda buning bir necha yo'li mavjud. Bu erda ishlatiladigan usul vizual ravshanlikni ta'minlash edi. Biroq, bu kabi tugma parametrlarini yaratish usuli sizda juda ko'p tugmachalar bo'lsa, juda ko'p joy egallaydi. Men jadvallarimni joyni tejashga imkon beradigan tarzda loyihalashtirishni afzal ko'raman, lekin kerakli chegaradan oshib ketmaslik kerak. Bizning misolimizdan foydalanib men quyidagi parametrlar jadvalini yarataman:

button_parameters \u003d (click_function \u003d "buttonClicked", function_owner \u003d nil, label \u003d "Meni bosing", holat \u003d (0,0.8,0), aylanish \u003d (0,0,0), kenglik \u003d 500, balandlik \u003d 500, font_size \u003d yuz )

Qo'shimcha kredit: Bu ob'ektlar bilan qilishingiz mumkin bo'lgan turli xil narsalar bilan o'ynashni boshlash uchun eng zo'r vaqt. Bilimlar bazasidagi Ob'ekt sahifasiga o'ting va materialni sinab ko'ring. Ob'ektlarni harakatga keltiring, ularni joylarini almashtiring, ranglarini o'zgartiring.

Qo'shimcha kredit: Shuningdek, har safar tugma bosilganda click_function ikkita parametr bilan ishlaydi. Birinchisi, ob'ektga havola, xususan tugma bog'langan ob'ektga havola. Ikkinchisi - chiziq formatidagi rang (masalan, "Moviy" - ko'k), tugmani bosgan o'yinchining rangi.

5) mantiqiy bayonotlar

O'zgaruvchan taqqoslash

Yana bir marta buttonClicked () funktsiyasi ichidagi barcha skriptlarni olib tashlang. Biz yangi o'zgaruvchini yaratamiz va keyin uni o'zgartiramiz. Yangi o'zgaruvchi mantiqiy tipda bo'ladi. Mantiqiy qiymatlar faqat to'g'ri, yolg'on bo'lishi mumkin. Mantiqiy qiymatlar har doim kichik harflar bilan yoziladi. Birinchidan, biz o'zimizning o'zgaruvchini ob'ektimiz va tekshiruvchi GUID-larimiz ostida yaratamiz.

trueOrFalse \u003d rost

Keyin buttonClicked-da trueOrFalse-ning to'g'riligini tekshirish uchun ba'zi mantiqlarni o'rnatamiz. Agar u rost bo'lsa, u Rost ekanligini chop etadi va False-ga o'zgartiradi. Agar tugma yana bosilsa, u False ekanligini chop etadi va qiymatni Rostga o'tkazadi.

if trueOrFalse then print ("trueOrFalse true edi.") - trueOrFalse true edi. trueOrFalse \u003d false else print ("trueOrFalse noto'g'ri edi.") - trueOrFalse noto'g'ri edi. trueOrFalse \u003d haqiqiy oxir

Buni "if trueOrFalse \u003d\u003d true then" kabi yozishimiz mumkin, ammo bu ixtiyoriy. IF so'ziga mantiqiy qiymatni berishni unutmang. TrueOrFalse allaqachon ulardan biri bo'lganligi sababli, biz "\u003d\u003d true" ni qo'yib yuborishimiz mumkin.

Loop - bu kodni bir necha marta ishlashi mumkin bo'lgan qism. Bu siz LUA-da ishlatadigan murakkab elementlardan biridir. Ular ko'pincha jadvallar bilan birga keladi, bu sizga jadvaldagi har bir yozuv uchun kodni ishlatishga imkon beradi.

Bu boshqa turdagi - ipairs. Raqamli tugmachalarsiz jadvallar uchun juftliklar, ketma-ket raqamli tugmalar (massivlar) bo'lgan jadvallar uchun juftliklar kerak. ipairs tartibda keladi, bu erda juftliklar har qanday tartibda borishlari mumkin.

Bizning bugungi mehmonimiz - yashirin frontning haqiqiy kurashchisi. Siz buni o'yinlarda (World of Warcraft, Angry Birds, X-Plane, S.T.A.L.K.E.R.) yoki Adobe mahsulotlarida (Lightroom) ko'rgan bo'lishingiz mumkin, lekin siz uning borligi haqida hech o'ylamagansiz. Ayni paytda, bu til deyarli 25 yoshda va bu vaqt ichida bizning virtual hayotimiz jimgina biroz yaxshilandi.

Tez ma'lumot

Lua 1993 yilda Rio-de-Janeyro katolik universiteti tomonidan yaratilgan. Ism portugal tilidan Luna deb tarjima qilingan va ijodkorlar ishonchli tarzda LUA yozmaslikni iltimos qilmoqdalar, shunda Xudo saqlasin, kimdir bu ismni qisqartirish uchun qabul qilmasin. Bu OOP prototip modelidan foydalanadigan ko'p paradigma skript tilidir.

Bu erda matn terish dinamik bo'lib, merosni amalga oshirish uchun metatabllar ishlatiladi, ya'ni bu sizning mahsulotingiz imkoniyatlarini kengaytirish uchun ajoyib vosita. Bundan tashqari, ixchamligi tufayli deyarli har qanday platformada foydalanish uchun javob beradi. O'zingiz uchun hakam: tarball Lua 5.3.4 og'irligi atigi 296 kilobaytni (siqilmagan - 1,1 megabayt), Linux uchun tarjimon (C da yozilgan) - 182 dan 246 kilobaytgacha va standart kutubxonalar to'plami yana 421 kilobaytni tashkil qiladi.

Kod

Tashqi ko'rinishi va qobiliyatiga ko'ra, Lua JavaScript-ni qayta tiklashga qaratilgan yana bir urinishga o'xshaydi, agar bu ikki yildan keyin paydo bo'lgan bo'lsa. O'zingiz ko'ring:

An'anaviy bilan boshlaymiz:

chop etish ("Salom dunyo")

Qabul qilaman, tanish va juda ma'lumotli emas. Lua bilan tanishish nuqtai nazaridan yanada qiziqarli misol - kiritilgan raqamning faktorialini hisoblash:

Funktsiya haqiqati (n)
agar n \u003d\u003d 0 bo'lsa
qaytish 1
boshqa
return n * fact (n-1)
oxiri
oxiri

Chop etish ("raqamni kiriting:")
a \u003d io.read ("* number") - raqamni o'qing
chop etish (fakt (a))

Hammasi aniq. Aytgancha, Lua parallel topshiriqni qo'llab-quvvatlaydi:

Va nihoyat, kutubxonalardan foydalangan holda juda oddiy misol:

# shu jumladan
# shu jumladan
# shu jumladan
# shu jumladan
# shu jumladan

Int main (bekor) (
char buff;
int xatosi;
lua_State * L \u003d lua_open (); / * Lua-ni ochadi * /
luaopen_base (L); / * asosiy kutubxonani ochadi * /
luaopen_table (L); / * stol kutubxonasini ochadi * /
luaopen_io (L); / * kiritish-chiqarish kutubxonasini ochadi * /
luaopen_string (L); / * lib satrini ochadi. * /
luaopen_math (L); / * matematik libni ochadi. * /

While (fgets (buff, sizeof (buff), stdin)! \u003d NULL) {
error \u003d luaL_loadbuffer (L, buff, strlen (buff), "line") ||
lua_pcall (L, 0, 0, 0);
agar (xato) (
fprintf (stderr, "% s", lua_tostring (L, -1));
lua_pop (L, 1); / * to'plamdan xato xabari * /
}
}

Lua_close (L);
qaytish 0;
}

Afzalliklari va kamchiliklari

Xo'sh, Lua nima uchun foydalidir?

Birinchidan, allaqachon ta'kidlab o'tilganidek, uning ixchamligi va manba kodi C da yozilganligi bilan siz sayyoradagi eng mashhur tillardan biri va mavjud bo'lgan platformalarning keng doirasi bilan to'liq aloqada bo'lasiz.

Rivojlanish muhiti

Eclipse uchun LDT (Lua Development Tools) - eng mashhur IDElardan biri uchun kengaytma;

ZeroBrane Studio - bu Lua tilida yozilgan ixtisoslashgan muhit;

Decoda - bu eng mashhur o'zaro faoliyat platforma IDE emas, lekin u alternativa sifatida ishlaydi;

SciTE - bu Lua-ni to'liq qo'llab-quvvatlaydigan yaxshi muharrir;

WoWUIDesigner - taxmin qiling, bu muhit qaysi o'yin skriptlarni, shu jumladan Lua-ni qayta ishlashga yordam beradi?

foydali havolalar

http://www.lua.org/home.html - barcha kerakli ma'lumotlar, o'quv qo'llanmalari, kitoblar, hujjatlar va hattoki o'ziga xos hazil bilan rasmiy sayt;

http://tylerneylon.com/a/learn-lua/ - bu Tayler Neylonning ajoyib qo'llanmasi. Ingliz tilini yaxshi biladigan tajribali dasturchilar uchun javob beradi (shu bilan birga, lug'at bilan bog'liq muammolar ham bo'lmaydi) va shunchaki o'z ufqlarini kengaytirishni xohlaydi;

https://zserge.wordpress.com/2012/02/23/lua- 60 daqiqa davomida / - Lua asoslari ushbu tilga befarq bo'lmagan dasturchidan 60 daqiqada. Rus tilida;

http://lua-users.org/wiki/LuaTutorial - wiki qo'llanmasi

https://youtube.com/watch?v\u003dyI41OL0-DWM - YouTube-da IDE sozlamalarini va tilning asosiy tamoyillarini vizual ravishda tushunishga yordam beradigan video darsliklar.

Lua sizga kuch beradi; siz mexanizmlarni yaratasiz.
// Roberto Ierusalimskiy


Kirish

Lua - bu o'z foydalanuvchilariga konfiguratsiya skriptlarini va yuqori darajadagi skriptlarni yozish imkoniyatini berish uchun boshqa dasturlarga joylash uchun mo'ljallangan dasturlash tili. Lua protsessual, ob'ektiv va funktsional dasturlash uslublarini qo'llab-quvvatlaydi, ammo ayni paytda oddiy til hisoblanadi. Lua tarjimoni ANSI-C da yozilgan va har qanday dasturga ulanadigan kutubxona. Bunday holda, boshqarish dasturi Lua kodining bir qismini bajarish va ushbu kodda belgilangan ma'lumotlar bilan ishlash uchun kutubxona funktsiyalarini chaqirishi mumkin. Shuningdek, boshqaruv dasturi o'z funktsiyalarini Lua kodidan chaqirilishi uchun ro'yxatdan o'tkazishi mumkin. Oxirgi xususiyat Lua-ni har qanday dasturga moslasha oladigan til sifatida ishlatishga imkon beradi. Lua uchun yana bir foydalanish oddiy, mustaqil skriptlarni yozishdir. Shu maqsadda ushbu kutubxonadan konsoldan yoki fayldan kiritilgan kodni bajarishda foydalanadigan oddiy Lua tarjimoni mavjud.

Leksik kelishiklar

Identifikatorlar harflar, raqamlar va pastki chiziqlarni o'z ichiga olishi mumkin va ularni raqam bilan boshlash mumkin emas.

Pastki chiziq bilan boshlanadigan va faqat katta harflardan iborat identifikatorlar tarjimon tomonidan ichki foydalanish uchun ajratilgan.

Identifikatorlar katta va kichik harflarni ajratib turadi.

Stringli harflar bitta yoki ikkita tirnoq bilan berilishi mumkin. Ular quyidagi maxsus belgilar ketma-ketliklaridan foydalanishlari mumkin:

\\ n satr tasmasi (LF \u003d 0x0a) \\ qo'ng'iroq \\ r aravachasi qaytish (CR \u003d 0x0d) \\ b backspace \\ t tab \\ f form feed \\\\ backslash character \\ v vertikal yorliq \\ "quote \\ [chap kvadrat qavs \\" apostrof \\] o'ng kvadrat qavs \\ ddd belgisi bilan ddd kodi (o'nlik) \\ 0 belgisi bilan 0 belgisi

Agar manba faylida satr oxirida teskari chiziq bo'lsa, keyingi satrda string literal ta'rifini davom ettirish mumkin, bunda yangi satr belgisi qo'yiladi.

String literallari, shuningdek, ikki qavatli qavs ichiga olinishi mumkin [[....]]. Bunday holda, literalni bir nechta satrlarda belgilash mumkin (satr satrlari literal qatoriga kiritilgan) va maxsus belgilar ketma-ketligini izohlamaydi.

Agar "[[" belgilaridan so'ng darhol chiziqli ozuqa mavjud bo'lsa, u mag'lubiyatga qo'shilmaydi.

Ikkita kvadrat qavslardan tashqari, [\u003d\u003d\u003d [....] \u003d\u003d\u003d] belgisidan o'zboshimchalik bilan teng belgilar soni (ochilish va yopish chegaralari uchun bir xil) joylashgan chiziq ajratgichlari sifatida foydalanish mumkin. takrorlangan kvadrat qavslar orasidagi.

Raqamli konstantalar ixtiyoriy kasr qismi va ixtiyoriy o'nlik tartibini o'z ichiga olishi mumkin, ular "e" yoki "E" belgilari bilan belgilanadi. Butun sonli konstantalar 0x prefiksi yordamida hexda ko'rsatilishi mumkin.

Izoh "-" (ketma-ket ikkita minus belgi) bilan boshlanadi va satr oxirigacha davom etadi. Agar "-" belgilaridan so'ng darhol "[[" belgilar mavjud bo'lsa, u holda sharh ko'p satrli bo'lib, "]] belgilariga qadar davom etadi. Ko'p satrli izoh tarkibiga [[....]] belgi juftlari kirishi mumkin. Ikkita kvadrat qavslardan tashqari, [\u003d\u003d\u003d [....] \u003d\u003d\u003d] belgisidan ko'p satrli izohlar uchun ajratuvchi sifatida ham foydalanish mumkin, bunda ixtiyoriy ravishda teng belgilar (ochilish va yopish uchun bir xil) ajratuvchilar) takrorlangan kvadrat qavslar orasida joylashgan. String sobit izohni boshlash belgilaridan qochib ketadi.

Agar faylning birinchi satri "#" belgisi bilan boshlangan bo'lsa, u holda u o'tkazib yuboriladi. Bu Luani Unix-ga o'xshash tizimlarda skript tarjimoni sifatida ishlatishga imkon beradi.

Ma'lumot turlari

Lua quyidagi ma'lumotlar turlarini taqdim etadi:

Nil bo'sh mantiqiy mantiqiy raqam raqamli mag'lubiyat qatori funktsiyasi foydalanuvchi ma'lumotlari funktsiyasi foydalanuvchi ma'lumotlari iplari jadvali assotsiativ qatori

Nil turi o'zgaruvchining qiymati yo'qligini anglatadi. Ushbu turdagi nil qiymatiga ega.

Mantiqiy tur ikki ma'noga ega: rost va yolg'on.

Nol qiymati noto'g'ri deb hisoblanadi. Boshqa barcha qiymatlar, jumladan 0 raqami va bo'sh satr mantiqiy haqiqiy hisoblanadi.

Barcha raqamlar ikki aniqlikdagi haqiqiy sonlar sifatida ifodalanadi.

Satrlar 8-bitlik belgilar massivi bo'lib, ular ichida nol kodli belgini o'z ichiga olishi mumkin. Luadagi barcha satrlar doimiy, ya'ni. mavjud satr tarkibini o'zgartira olmaysiz.

Funksiyalar o'zgaruvchiga berilishi, funktsiyalarga argument sifatida uzatilishi, funktsiya natijasida qaytarilishi va jadvallarda saqlanishi mumkin.

Userdata turi o'zboshimchalik bilan ma'lumotlar joylashtirilishi mumkin bo'lgan ko'rsatilmagan ko'rsatkichga mos keladi. Lua dasturi to'g'ridan-to'g'ri bunday ma'lumotlar bilan ishlay olmaydi (ularni yaratish, o'zgartirish). Ushbu ma'lumotlar turi, tenglik uchun taqqoslash va taqqoslashdan tashqari, oldindan belgilangan har qanday operatsiyalarga mos kelmaydi. Shu bilan birga, bunday operatsiyalarni metametodlar mexanizmi yordamida aniqlash mumkin.

Ip turi mustaqil bajariladigan ipga mos keladi. Ushbu ma'lumot turi korutinli dvigatel tomonidan qo'llaniladi.

Jadval turi har qanday qiymat bilan indekslanishi mumkin bo'lgan va bir vaqtning o'zida o'zboshimchalik turlarining qiymatlarini o'z ichiga oladigan jadvallar - assotsiativ massivlarga mos keladi.

O'zgaruvchida saqlanadigan ob'ekt turini type () funktsiyasini chaqirish orqali bilib olish mumkin. Ushbu funktsiya turning kanonik nomini o'z ichiga olgan qatorni qaytaradi: "nil", "number", "string", "boolean", "table", "function", "thread", "userdata".

Raqamlar va satrlar orasidagi konversiyalar tegishli kontekstda ishlatilganda avtomatik ravishda ro'y beradi.

Arifmetik amallar sonli argumentlarni o'z ichiga oladi va bunday amalni satrlarda bajarishga urinish ularni raqamlarga o'tkazadi. Raqamlarda bajarilgan satr operatsiyalari ularni ba'zi bir qat'iy format konvertatsiyasi yordamida satrga aylantirishga olib keladi.

Shuningdek, tostring () funktsiyasi yordamida ob'ektni mag'lubiyatga yoki tonumber () funktsiyasi yordamida raqamga aylantirishingiz mumkin. Raqamlarni satrga aylantirish ustidan ko'proq nazorat qilish uchun formatni o'zgartirish funktsiyasidan foydalaning.

O'zgaruvchilar

Lua-da o'zgaruvchilar e'lon qilinishi shart emas. O'zgaruvchi birinchi marta ishlatilganda paydo bo'ladi. Agar ilgari ishga tushirilmagan o'zgaruvchidan foydalanilsa, u nolga teng bo'ladi. O'zgaruvchilar statik turga ega emas, o'zgaruvchining turi uning joriy qiymati bilan belgilanadi.

Agar o'zgaruvchi mahalliy sifatida aniq e'lon qilinmasa, global hisoblanadi. Mahalliy o'zgaruvchan deklaratsiyalar blokning istalgan joyida joylashgan bo'lishi mumkin va ularni boshlash bilan birlashtirilishi mumkin:

Mahalliy x, y, z mahalliy a, b, c \u003d 1, 2, 3 mahalliy x \u003d x

Mahalliy o'zgaruvchi tenglik belgisining o'ng tomonida boshlanganda, kirish o'zgaruvchisi hali mavjud emas va joriy blokning tashqi o'zgaruvchisining qiymati ishlatiladi. Shuning uchun uchinchi satrdagi misol to'g'ri (u tilda keng tarqalgan iborani namoyish etadi).

Mahalliy o'zgaruvchilar uchun tarjimon leksik ko'lamlardan foydalanadi, ya'ni. o'zgaruvchining ko'lami, uni e'lon qilish nuqtasidan (birinchi foydalanish) joriy blokning oxirigacha cho'ziladi. Bunday holda, mahalliy o'zgaruvchi u tasvirlangan blokning ichki qismidagi bloklarda ko'rinadi. Mahalliy o'zgaruvchi, uning doirasidan chiqib ketganda yo'qoladi. Agar lokal o'zgaruvchi blokdan tashqarida aniqlangan bo'lsa, unda bunday o'zgaruvchi ushbu kod bo'lagi bajarilishi oxirida yo'qoladi, chunki kod bo'limi tarjimon tomonidan noma'lum funktsiya sifatida bajariladi. Boshlang'ich global o'zgaruvchi tarjimon ishlashining butun muddati davomida mavjud.

Uni olib tashlash uchun o'zgaruvchiga nilni belgilashingiz mumkin.

Massivlar, funktsiyalar va foydalanuvchi ma'lumotlari ob'ektlardir. Barcha ob'ektlar noma'lum va o'zgaruvchining qiymati bo'lishi mumkin emas.

O'zgaruvchilar ob'ektlarga havolalarni saqlaydi. Tayinlashda, argument sifatida funktsiyaga o'tishda va natijada funktsiyadan qaytishda ob'ektlar ko'chirilmaydi, faqat ularga havolalar ko'chiriladi.

Jadvallar

Jadvallar (tiplar jadvali) assotsiativ massivlarga mos keladi, ular nildan boshqa har qanday qiymatlar bilan indekslanishi mumkin va bir vaqtning o'zida nildan tashqari o'zboshimchalik turlarining qiymatlarini o'z ichiga olishi mumkin. Jadval elementlari ob'ektlar - jadvallar, funktsiyalar va foydalanuvchi ma'lumotlari ob'ektlari bilan ham indekslanishi mumkin. Qadriyatlar berilmagan massiv elementlari sukut bo'yicha nolga teng.

Jadvallar Luadagi asosiy ma'lumotlar tuzilmasi hisoblanadi. Ular shuningdek, tuzilmalarni, sinflarni va ob'ektlarni ifodalaydi. Bunday holda, struktura maydonining satr nomi bilan indekslash qo'llaniladi. Massiv elementi funktsiya bo'lishi mumkinligi sababli, tuzilmalarda usullarga ham ruxsat beriladi.

Massivlarni indekslash uchun kvadrat qavslardan foydalaning: array. Struct.field yozuvi quyidagi yozuvga teng: struct ["field"]. Ushbu sintaksis jadvallarni nomlangan maydon yozuvlari sifatida ishlatishga imkon beradi.

Jadval konstruktori - bu yangi jadval yaratadigan va qaytaradigan ifoda. Konstruktorning har bir ishi yangi jadval yaratadi. Jadval konstruktori - bu vergul bilan ajratilgan va ";" jingalak qavslar ichiga olingan maydonni boshlovchi (ehtimol bo'sh) ro'yxati. (vergul). Quyidagi variantlar dala boshlovchilari uchun amal qiladi:

Exp2 jadvali \u003d exp2 nomi \u003d exp jadvali ["name"] \u003d exp exp jadvali [j] \u003d exp

Ikkinchi holda, j o'zgaruvchisi 1 dan boshlab ketma-ket butun son qiymatlari orqali ishlaydi. Dastlabki ikkita boshlang'ich ushbu hisoblagich qiymatini o'zgartirmaydi. Jadvalni qurishga misol:

X \u003d (len \u003d 12, 11, 12, \u003d 1123)

Bunday operatorni bajargandan so'ng jadval maydonlari quyidagi qiymatlarni oladi:

X ["len"] \u003d x.len \u003d 12 x \u003d 11 x \u003d 12 x \u003d 1123

Agar boshlang'ich ro'yxatining so'nggi elementi funktsiya chaqiruvi bo'lsa, unda funktsiya tomonidan qaytarilgan qiymatlar ketma-ket initsialator ro'yxatiga joylashtiriladi. Ushbu xatti-harakatni funktsiya chaqiruvini qavs ichiga yopish orqali o'zgartirish mumkin. Bunday holda, funktsiya tomonidan qaytarilgan barcha qiymatlardan faqat birinchisi ishlatiladi.

Oxirgi boshlovchidan keyin ixtiyoriy maydon boshlovchisini ajratuvchi belgisi (vergul yoki vergul) bo'lishi mumkin.

Amaliyotlar

Asosiy operatsiyalar quyida keltirilgan:

O'zgarish belgisi + - * / arifmetik ^ eksponentatsiya \u003d\u003d ~ \u003d tenglik< <= > \u003e \u003d not order va yoki mantiqiy .. satrlarni birlashtirish # qator yoki qator uzunligini olish

Arifmetik amallardan foydalanganda unga sonli qiymatga ega satrlar tashlanadi. Raqamli qiymatlarni biriktirishda ular avtomatik ravishda satrlarga aylantiriladi.

Tenglik uchun taqqoslash turdagi konversiyani amalga oshirmaydi. Har xil turdagi ob'ektlar har doim har xil deb hisoblanadi.

Shunga ko'ra, "0" ~ \u003d 0, va indekslashda a va a ["0"] massivning turli kataklariga to'g'ri keladi. Ob'ektlarning tengligi / tengsizligi uchun taqqoslaganda ob'ektlarga havolalarni taqqoslash amalga oshiriladi. Xuddi shu ob'ektga tegishli o'zgaruvchilar tengdir.

Tartibni aniqlayotganda, argumentlarning turlari mos kelishi kerak, ya'ni. raqamlar raqamlar bilan taqqoslanadi va satrlar satrlar bilan taqqoslanadi.

Tenglik va tartib munosabatlari har doim haqiqiy yoki yolg'onga olib keladi, ya'ni. mantiqiy qiymat.

Mantiqiy operatsiyalarda nil noto'g'ri deb hisoblanadi va boshqa barcha qiymatlar, shu jumladan nol va bo'sh satr haqiqiy deb hisoblanadi.

Qiymatni hisoblashda qisqa tutashuv qo'llaniladi - ikkinchi dalil faqat kerak bo'lganda hisoblab chiqiladi.

Operatsiyalarning quyidagi ustuvorliklar va assotsiativlik jadvali qo'llaniladi:

^ emas # - (unary) * / + -< > <= >\u003d ~ \u003d \u003d\u003d .. va yoki

Mantiqiy amallar va tegishli iboralar

Not operatori har doim o'zboshimchalik turidagi argumentni qabul qilib, mantiqiy qiymatni qaytaradi (faqat nol qiymat mantiqiy qiymatga mos keladi, qolganlari haqiqiy deb hisoblanadi). Aksincha, va va yoki operatorlari har doim o'zlarining argumentlaridan birini qaytaradilar. Yoki operator birinchi argumentni qaytaradi, agar uning qiymati "false" va "nil" dan farqli bo'lsa, ikkinchi argument - aks holda. Va operator birinchi argumentni qiymati noto'g'ri yoki nol bo'lsa, ikkinchi argument aks holda qaytaradi. Ushbu xatti-harakatlar barcha nolga teng bo'lmagan qiymatlarni haqiqiy deb hisoblashiga asoslanadi.

Ushbu xatti-harakatlar bilan bir nechta keng tarqalgan iboralar bog'liq. Quyidagi jadvalda chapdagi idiomatik operatsiya va o'ngdagi ekvivalent normal yozuv ko'rsatilgan:

X \u003d x yoki v agar x \u003d\u003d nil bo'lsa x \u003d v oxiri x \u003d (e va a) yoki b bo'lsa e ~ \u003d nil bo'lsa x \u003d a else x \u003d b oxiri

Birinchi ibora ko'pincha boshlanmagan o'zgaruvchiga standart qiymatni belgilash uchun ishlatiladi. Ikkinchi ibora C "operatoriga teng x \u003d e? A, b (bu erda a o'zgaruvchining qiymati nolga teng emas deb qabul qilinadi).

Operatorlar

Lua dasturni bajarishni boshlash uchun maxsus funktsiyaga ega emas. Tarjimon fayldan yoki boshqaruv dasturidan olgan gaplarni ketma-ket bajaradi. Bunda u dasturni oldindan ikkilik ko'rinishda kompilyatsiya qiladi, uni ham saqlash mumkin. Kodning har qanday bloki anonim funktsiya sifatida bajariladi, shuning uchun siz mahalliy o'zgaruvchilarni aniqlab, undan qiymat qaytarishingiz mumkin.

Operatorlarni ";" bilan ajratish mumkin (lekin shart emas). ...

Bir nechta topshiriqlarga ruxsat beriladi:

Var1, var2 \u003d val1, val2

Bunday holda, hizalama amalga oshiriladi - qo'shimcha qiymatlar bekor qilinadi va etishmayotgan qiymatlarga mos keladigan o'zgaruvchilarga nol qiymati beriladi. Ko'p topshiriqning o'ng tomonida paydo bo'ladigan barcha iboralar topshiriqning o'zidan oldin baholanadi.

Agar funktsiya bir nechta qiymatni qaytaradigan bo'lsa, unda bir nechta tayinlash yordamida siz qaytarish qiymatlarini olishingiz mumkin:

X, y, z \u003d f (); a, b, c, d \u003d 5, f ();

Umuman olganda, agar funktsiya chaqiruvi tayinlash belgisining o'ng tomonidagi qiymatlar ro'yxatining oxirida joylashgan bo'lsa, unda funktsiya tomonidan qaytarilgan barcha qiymatlar qiymatlar ro'yxatining oxiriga qo'shiladi. Ushbu xatti-harakatni funktsiya chaqiruvini qavs ichiga yopish orqali o'zgartirish mumkin. Bunday holda, funktsiya tomonidan qaytarilgan barcha qiymatlardan faqat birinchisi ishlatiladi.

Asosiy operatorlar quyida keltirilgan:

Do ... end agar ... keyin ... agar ... agar ... keyin ... else ... agar agar ... keyin ... elseif ... keyin ... agar agar ... keyin. .. elseif ... then ... else ... end while ... do ... end takrorlash ... qadar ... uchun var \u003d start, stop do ... end uchun var \u003d start, stop, step do ... end return return ... break

Do ... end bloki bayonotlar ketma-ketligini bitta gapga aylantiradi va mahalliy o'zgaruvchilarni belgilashingiz mumkin bo'lgan yangi ko'lamni ochadi.

If, while va takroriy so'zlarida, ifoda qiymatlari noto'g'ri va noldan boshqa barcha qiymatlar to'g'ri deb talqin etiladi.

If ifodasining umumiy shakli:

Agar ... keyin ... (aks holda ... keyin ...) tugaydi

Qaytish bayonotida hech qanday qaytarish qiymatlari yoki bir yoki bir nechta iboralar (ro'yxat) bo'lishi mumkin emas. Kod bloki noma'lum funktsiya sifatida bajarilganligi sababli, qaytish qiymati nafaqat funktsiya uchun, balki kodning ixtiyoriy bloki uchun ham bo'lishi mumkin.

Return va break operatorlari blokdagi oxirgi gaplar bo'lishi kerak (ya'ni, ular kodlar blokidagi oxirgi bayonotlar bo'lishi yoki end, else, elseif, until so'zlaridan oldin joylashtirilgan bo'lishi kerak). Blok ichida siz do return end yoki do break end iborasini ishlatishingiz kerak.

For iborasi tsikl o'zgaruvchisining boshlang'ich qiymatidan oxirigacha bo'lgan qiymatigacha bo'lgan barcha qiymatlari uchun bajariladi. Uchinchi qiymat, agar ko'rsatilgan bo'lsa, tsikl o'zgaruvchisini o'zgartirish bosqichi sifatida ishlatiladi. Ushbu qiymatlarning barchasi raqamli bo'lishi kerak. Ular ko'chadan oldin bir marta baholanadi. Loop o'zgaruvchisi ushbu tsikl uchun lokaldir va uning tanasidan tashqarida mavjud emas. Davr o'zgaruvchisi qiymatini tsikl tanasi ichida o'zgartirish mumkin emas. For bayonotining bajarilishini namoyish etish uchun psevdo kodi:

Local var, _limit, _step \u003d tonumber (start), tonumber (stop), no number (agar) bo'lmasa (var va _limit va _step), then error () end while (_step\u003e 0 and var<=_limit) or (_step<=0 and var>\u003d _limit) do ... var \u003d var + _step end end

Vazifalar

Funktsiya ta'rifi - bu funktsiya tipidagi ob'ektga baho beradigan bajariladigan ifoda (funktsiya konstruktori):

F \u003d funktsiya (...) ... oxiri

Qavslar ichida (ehtimol bo'sh) funktsiya argumentlari ro'yxati joylashtirilgan. Funktsiya argumentlari ro'yxati ellips bilan tugashi mumkin - bu holda funktsiya o'zgaruvchan sonli argumentga ega. Funktsiyaning tanasi yopiladigan qavs va tugatish operatori orasiga joylashtirilgan.

Funktsiyani aniqlash uchun quyidagi qisqa shakllar mavjud:

Funksiya fname (...) ... end fname \u003d function (...) ... end local function fname (...) ... end local fname \u003d function (...) ... end function x .fname (...) ... end x.fname \u003d function (...) ... end function x: fname (...) ... end x.fname \u003d function (self, ...) ... oxiri

Funktsiya konstruktorining bajarilish vaqtida u ham yaratadi yopilish - funktsiyada mavjud bo'lgan va unga tashqi barcha mahalliy o'zgaruvchilar jadvali. Agar funktsiya qaytarish qiymati sifatida qabul qilingan bo'lsa, u holda uning yopilishiga kiritilgan barcha o'zgaruvchilarga kirish imkoniyati saqlanib qoladi. Har safar funktsiya konstruktori bajarilganda, yangi yopilish quriladi.

Funktsiya chaqiruvi funktsiya ma'lumotnomasi va qavs ichida berilgan argumentlar ro'yxatidan (ehtimol bo'sh) iborat. Funktsiya ma'lumotnomasi funktsiyani baholaydigan har qanday ifoda bo'lishi mumkin. Funktsiya ma'lumotnomasi va ochiladigan qavs o'rtasida chiziqli besleme bo'lishi mumkin emas.

Qo'ng'iroq qilish funktsiyalari uchun quyidagi qisqa shakllar mavjud:

F (...) f ((...)) f ("...") f "..." f ("") f "" f ([[...]]) f [[. ..]] x: f (...) xf (x, ...)

Birinchi holda, bitta argument - bu uchish jadvali, keyingi uchtasida esa mag'lubiyat. Ikkinchi holatda, x o'zgaruvchisi olinadigan jadval sifatida ishlatiladi, bu chaqirilgan funktsiyaga havola bo'lib, xuddi shu jadval birinchi argument sifatida funktsiyaga uzatiladi. Ushbu sintaktik xususiyat ob'ektlarni amalga oshirish uchun ishlatiladi.

Funktsiya chaqirilganda, oddiy turdagi qiymatlar qiymat bo'yicha argumentlarga, ob'ektlar uchun mos yozuvlar argumentlarga ko'chiriladi. Funktsiya chaqirilganda, argumentlar soni hizalanadi - qo'shimcha qiymatlar bekor qilinadi va etishmayotgan qiymatlarga mos keladigan argumentlar nol bo'ladi. Agar parametrlar ro'yxati oxirida bir nechta qiymatlarni qaytaradigan funktsiyaga qo'ng'iroq bo'lsa, unda ularning barchasi argumentlar ro'yxatiga qo'shiladi. Ushbu xatti-harakatni funktsiya chaqiruvini qavs ichiga yopish orqali o'zgartirish mumkin. Bunday holda, funktsiya tomonidan qaytarilgan barcha qiymatlardan faqat birinchisi ishlatiladi.

Agar funktsiya o'zgaruvchan sonli argumentga ega bo'lsa, unda biron bir argumentga berilmagan qiymatlarni ma'lum bir ism yordamida olish mumkin. Ushbu nom funktsiya tomonidan qaytarilgan qiymatlar to'plami kabi o'zini tutadi, ya'ni. ifoda ichida yoki qiymatlar ro'yxatining o'rtasidan paydo bo'lganda, faqat birinchi qaytish qiymati ishlatiladi. Agar ism ... qiymatlar ro'yxatining oxirgi holatida (jadval konstruktorlarida, bir nechta topshiriqlarda, funktsiyani chaqirishda argumentlar ro'yxatida va return operatorida) paydo bo'lsa, u holda barcha qaytarilgan qiymatlar ushbu ro'yxatning oxiriga joylashtirilgan (ro'yxatlarni to'ldirish qoidasi). Ushbu xatti-harakatni bostirish uchun ... nomi qavs ichiga olinishi mumkin. Siz (...) iborasi yordamida qiymatlar to'plamini ro'yxatga aylantirishingiz mumkin.

Agar funktsiya bitta argumentni qabul qilsa va uni jadval sifatida ko'rib chiqsa, uning elementlari funktsiyaning rasmiy parametrlari nomlari bilan indekslangan bo'lsa, unda bu holda nomlangan argumentlar mexanizmiga qo'ng'iroq amalga oshiriladi:

Funktsiya nomini o'zgartirish (arg) arg.new \u003d arg.new yoki arg.old .. ".bak" return os.rename (arg.old, arg.new) end rename (old \u003d "asd.qwe")

Funksiyadan qaytish uning tanasining bajarilishi tugagandan keyin ham, return operatori bajarilgandan keyin ham sodir bo'ladi. Qaytish operatori bir yoki bir nechta qiymatni qaytarishi mumkin. Agar qaytish qiymatlari ro'yxatining oxirida bir nechta qiymatlarni qaytaradigan funktsiyaga chaqiruv bo'lsa, unda ularning barchasi argumentlar ro'yxatiga qo'shiladi. Ushbu xatti-harakatni funktsiya chaqiruvini qavs ichiga yopish orqali o'zgartirish mumkin. Bunday holda, funktsiya tomonidan qaytarilgan barcha qiymatlardan faqat birinchisi ishlatiladi.

Agar funktsiya bayonot sifatida chaqirilsa, barcha qaytish qiymatlari yo'q qilinadi. Agar funktsiya ifodadan yoki qiymatlar ro'yxatining o'rtasidan chaqirilsa, faqat birinchi qaytish qiymati ishlatiladi. Agar funktsiya qiymatlar ro'yxatining so'nggi pozitsiyasidan chaqirilsa (jadval konstruktorlarida, bir nechta topshiriq bilan, funktsiyani chaqirishda argumentlar ro'yxatida va return operatorida), keyin barcha qaytarilgan qiymatlar joylashtiriladi ushbu ro'yxatning oxiri (ro'yxatni to'ldirish qoidasi). Ushbu xatti-harakatni bostirish uchun funktsiya chaqiruvi qavs ichiga olinishi mumkin.

Unpack () funktsiyasi mavjud, u elementlari 1 dan indekslangan qatorni oladi va uning barcha elementlarini qaytaradi. Ushbu funktsiya o'zgaruvchan sonli argumentlarni qabul qiladigan, haqiqiy argumentlar ro'yxatini dinamik ravishda ishlab chiqaradigan funktsiyalarni chaqirish uchun ishlatilishi mumkin. Teskari operatsiya quyidagicha amalga oshiriladi:

List1 \u003d (f ()) - f () funktsiyasi tomonidan qaytarilgan barcha qiymatlar ro'yxatini yaratish list2 \u003d (...) - o'zgaruvchan sonli argumentlar bilan funktsiyaga o'tgan barcha qiymatlar ro'yxatini yaratish

Qaytish qiymatlarining o'zgaruvchan soni, ro'yxatlarni to'ldirish qoidasi va funktsiyaga o'tish qobiliyati, barcha rasmiy parametrlar ahamiyatsiz tarzda o'zaro ta'sir qila olmaydi. Ko'pincha funktsiya (masalan, foo ()) normal tugashga javob qaytaradi va g'ayritabiiy bo'lsa xato xabari. Assert (val, msg) funktsiyasi, agar val noto'g'ri yoki nil bo'lsa va aks holda val-ni qaytarsa, xabar xabari bilan xato hosil qiladi (xato (msg) funktsiyasini chaqirib). Keyin operator

V \u003d tasdiqlash (foo (), "xabar")

muvaffaqiyatli bo'lsa, foo () tomonidan qaytarilgan qiymatni v ga beradi. Bunday holda, foo () bitta qiymatni qaytaradi va assert () nil msg parametrini oladi. Xato paytida assert () funktsiyasi nil bo'ladi va xato xabari.

Iteratorlar

Iteratorlar o'zboshimchalik bilan ketma-ketlik elementlarini sanash uchun ishlatiladi:

V_1, v_2, ..., v_n uchun tushuntirishda ... tugaydi

V_1, ..., v_n ro'yxatidagi o'zgaruvchilar soni ixtiyoriy bo'lishi mumkin va tushuntirishlar ro'yxatidagi ifodalar soniga to'g'ri kelishi shart emas. Tushuntirish odatda iterator zavod funktsiyasiga qo'ng'iroqdir. Bunday funktsiya iterator funktsiyasini, tsiklni boshqarish o'zgaruvchisining holatini va boshlang'ich qiymatini qaytaradi. Takrorlovchi quyidagicha talqin qilinadi:

Local f, s, v_1 \u200b\u200b\u003d local v_2, ..., v_n ni tushuntirib, v_1, ..., v_n \u003d f (s, v_1) ni bajaring, agar v_1 \u003d\u003d nil bo'lsa, u holda break end ... end end

Har bir qadamda v_k barcha o'zgaruvchilarning qiymatlari iterator funktsiyasini chaqirish orqali hisoblanadi. V_1 boshqaruv o'zgaruvchisining qiymati tsiklning oxirini boshqaradi - takrorlovchi funktsiyasi var_1 o'zgaruvchisi uchun nil qiymatini qaytarishi bilan tsikl tugaydi.

Aslida v_1 o'zgaruvchisi takrorlanishlarni boshqaradi va qolgan o'zgaruvchilarni iterator funktsiyasi qaytargan "quyruq" deb hisoblash mumkin:

Lokal f, s, v \u003d izohlovchilarini bajaring, v \u003d f (s, v) bo'lsa v \u003d\u003d nil bo'lsa break end ... end end

Zavod funktsiyasi chaqiriladigan operator oddiy tayinlash operatori sifatida talqin etiladi, ya'ni. zavod funktsiyasi har qanday qiymatni qaytarishi mumkin.

Fuqaroligi yo'q iteratorlar

Ichki fuqaroligi bo'lmagan iterator, takrorlanadigan idishda o'z o'rnini aniqlashga imkon beradigan har qanday ichki ma'lumotlarni saqlamaydi. Boshqaruv o'zgaruvchisining keyingi qiymati to'g'ridan-to'g'ri avvalgi qiymatidan hisoblanadi va holat takrorlanadigan konteynerga havolani saqlash uchun ishlatiladi. Mana oddiy, fuqaroligi bo'lmagan iteratorga misol:

Funktsiya iter (a, i) i \u003d i + 1 local v \u003d a [i] if v then return i, v else return nil end end function ipairs (a) return iter, a, 0 end

Yopiq holatda holatni saqlaydigan iteratorlar

Agar iterator konteynerdan o'tish uchun ichki holatga muhtoj bo'lsa, uni eng oson yo'li uni zavod funktsiyasi kontekstida yaratilgan yopiq joyda saqlashdir. Mana oddiy misol:

Funktsiya ipairs (a) local i \u003d 0 local t \u003d local function iter () i \u003d i + 1 local v \u003d t [i] if v then return i, v else return nil end end return iter end

Bu erda iterator butun kontekstni yopiq joyda saqlaydi va boshqaruv o'zgaruvchisining holati va joriy qiymatiga muhtoj emas. Shunga ko'ra, iterator holat va boshqaruv o'zgaruvchisini qabul qilmaydi, va zavod holat o'zgarishi va boshqaruv o'zgaruvchisining boshlang'ich qiymatini qaytarmaydi.

Standart iteratorlar

Takroratorlarning eng keng tarqalgan qo'llanilishi jadval elementlarini kesib o'tishdir. Buning uchun bir nechta oldindan belgilangan iterator zavod funktsiyalari mavjud. Juftlik (t) fabrikasi har bir qadamda jadvaldagi indeksni va ushbu indeksda ajratilgan qiymatni beradigan iteratorni qaytaradi:

Idx uchun val juftlikda (tbl) bajariladi ... tugaydi

Aslida, ushbu iteratorni standart next (tbl, idx) funktsiyasi yordamida aniqlash oson:

Funktsiya juftliklari (tbl) keyingi, tbl, nil endga qaytadi

Keyingi (tbl, idx) funktsiyasi tbl jadvalining bir necha o'tishidan so'ng idxdan keyingi indeks qiymatini qaytaradi (next (tbl, nil) ni chaqirish boshlang'ich indeks qiymatini qaytaradi; jadval elementlari tugagandan so'ng nil qaytariladi).

Ipairs (tbl) zavodi yuqorida tavsiflanganga o'xshash ishlaydigan iteratorni qaytaradi, lekin 1 dan boshlanadigan butun sonlar bilan indekslangan jadvallarni aylanib o'tish uchun.

Meta jadvallar

Userdata turidagi har bir jadval va ob'ekt meta-jadvalga ega bo'lishi mumkin - oddiy jadval, uning maydonlari o'ziga xos maxsus operatsiyalar qo'llanilganda asl ob'ektning xatti-harakatini belgilaydi. Masalan, qo'shilish paytida ob'ekt operand bo'lib chiqsa, tarjimon metadablada __add nomli maydonni qidiradi va agar shunday maydon mavjud bo'lsa, unda uning qiymatini qo'shishni bajaruvchi funktsiya sifatida ishlatadi. Meta jadvallar arifmetik operatsiyalar, taqqoslash, birlashtirish va indekslash paytida ob'ektning xatti-harakatlarini aniqlashga imkon beradi. Shuningdek, foydalanuvchi ma'lumotlari turidagi ob'ekt chiqarilganda chaqiriladigan funktsiyani belgilashingiz mumkin. Meta jadvalidagi indekslar (maydon nomlari) chaqiriladi voqealarva tegishli qiymatlar (voqea ishlovchilari) metametodlar.

Odatiy bo'lib, yangi yaratilgan jadvalda meta-jadval mavjud emas. Har qanday mt jadvalini setmetatable (t, mt) funktsiyasini chaqirib, t jadvalining meta jadvalini tuzish mumkin. Getmetatable (t) funktsiyasi, agar jadvalda meta jadval bo'lmasa, jadvalning t yoki nil jadvalini qaytaradi. Har qanday jadval har qanday boshqa jadval uchun, shu jumladan o'zi uchun ham meta-jadval vazifasini o'tashi mumkin.

Lua quyidagi voqealarni belgilaydi:

Qo'shish, __sub, __mul, __div arifmetik operatsiyalar __pow ko'rsatkichi __unm unary minus __concat zakalatsiyalash __eq, __lt, __le taqqoslash operatsiyalari __ indeksga kirish imkoniyati etishmayotgan indeks __newindex tayinlash yangi jadval elementiga __call stol chaqiruvi __tostring funktsiyasiga __tostring

A ~ \u003d b ifoda (a \u003d\u003d b) emas deb baholanadi. A\u003e b ifodasi b ga baho beradi< a . Выражение a >\u003d b b deb hisoblanadi<= a . При отсутствии метаметода __le операция <= вычисляется как not (b < a) т.е. с помощью метаметода __lt .

Ikkilik operatsiyalar uchun ishlov beruvchi quyidagicha tanlanadi: birinchi operand so'raladi va agar u ishlov beruvchini aniqlamasa, ikkinchi operand so'raladi. Taqqoslash operatsiyalari uchun metametod tanlanadi, agar taqqoslanayotgan operandlar bir xil turdagi bo'lsa va shu amalni bajarish uchun bir xil metametod bo'lsa. Foydalanuvchi uchun qo'llanmada metua usullarini chaqirish kontekstini ko'rsatadigan Lua-da psevdo-kod mavjud.

__Index voqea ishlovchisi funktsiya yoki jadval bo'lishi mumkin. Funktsiya holatida ishlov beruvchi chaqiriladi va unga jadval va indeks qiymati beriladi. Bunday funktsiya indekslash natijasini qaytarishi kerak. Jadvalda jadval xuddi shu indeks bilan qayta indekslanadi. Agar __newindex voqea ishlovchisi mavjud bo'lsa, u holda yangi jadval elementiga qiymat berish o'rniga chaqiriladi. Agar ushbu ishlov beruvchi jadval bo'lsa, unda topshiriq shu jadvalga beriladi.

__Tostring metametodi sizga ob'ektni (jadval yoki userdata) mag'lubiyatga aylantirishga imkon beradi. __Metatable meta metodi meta jadvalini olish bilan ishlashga imkon beradi. Agar meta-jadvaldagi ushbu maydon qiymatga ega bo'lsa, unda getmetatable () funktsiyasi ushbu maydonning qiymatini qaytaradi va setmetatable () funktsiyasi ishlamay qoladi.

Meta jadvallardan foydalanish misollari

Jadval maydonlari uchun standart qiymat

Quyidagi misolda meta jadvallar etishmayotgan jadval elementlari uchun standart qiymatni belgilash uchun foydalaniladi:

Funktsiya set_def (t, v) local mt \u003d (__index \u003d function () return v end) setmetatable (t, mt) end

Har bir standart qiymat uchun alohida meta-jadval ishlatmaydigan yanada noan'anaviy echim:

Lokal kalit \u003d () local mt \u003d (__index \u003d function (t) return t end) function set_def (t, v) t \u003d v setmetatable (t, mt) end

Bu erda mahalliy (bo'sh) klaviatura jadvali ma'lum bo'lgan noyob indeks sifatida ishlatiladi, unda asl qiymati v t saqlangan v qiymati saqlanadi. Yo'qotilgan maydonlar uchun standart qiymat o'rnatilgan barcha jadvallar umumiy meta-jadval mt bilan bo'lishadilar. Ushbu meta-jadvalning __index meta-usuli yo'qolgan jadval maydonlarini chaqiradi va jadvalning o'zida saqlangan qiymatni kalit indeksida qaytaradi.

Ushbu echimning kamchiliklari bor: jadvalda yangi kalit-qiymat juftligi paydo bo'ladi, bu jadvalning barcha elementlarini kesib o'tishga harakat qilganda paydo bo'ladi.

Proksi-jadval

Quyidagi misolda bo'sh jadval jadval maydonlariga kirishni yo'naltirish uchun proksi sifatida ishlaydi:

Mahalliy kalit \u003d () local mt \u003d (__index \u003d function (t, k) return t [k] end, __newindex \u003d function (t, k, v) t [k] \u003d v end) function proxy (t) local proxy \u003d () proksi \u003d t setmetatable (proksi, mt) qaytariladigan proksi-server oxiri

Bu erda mahalliy (bo'sh) kalit jadvaldan ataylab noyob indeks sifatida foydalaniladi, uning yordamida dastlabki jadval t ga havola proksi-server jadvalida saqlanadi. Proksi - bu jadval, uning yagona elementi asosiy indeksga ega, shuning uchun proksi-serverning istalgan elementiga kirish meta-metodga qo'ng'iroq qilishga olib keladi. Barcha proksi-serverlar uchun umumiy bo'lgan meta-jadval asl jadvalni bitta proksi-elementdan oladigan va uni kalit jadval bilan indeksatsiya qiladigan __index va __newindex meta-usullarini belgilaydi.

Meta-usullar manbalar jadvalidagi maydonlarga qo'ng'iroqlarni qayta ishlash uchun o'zboshimchalik bilan intizomni ta'minlashi mumkin. Oddiy misollar - bu xitlarni yozish yoki jadval elementining qiymatini o'zgartirishga urinishda xatolik.

"Zaif" jadvallar

Agar ob'ekt jadvaldagi indeks sifatida ishlatilgan bo'lsa yoki unga havola jadvalda saqlangan bo'lsa, u holda axlat yig'uvchi ob'ektni qaytarib ololmaydi. Shu bilan birga, ba'zi hollarda uning elementlari kalitlari va / yoki qiymatlari bilan aloqasi "zaif" bo'lgan jadvalga ega bo'lish maqsadga muvofiqdir, ya'ni. axlat yig'ishga aralashmaslik. Odatda, bunday ehtiyoj jadvaldagi hisob-kitoblar natijalarini keshlashda va ob'ekt atributlarini ob'ektlarning o'zi tomonidan indekslangan jadvalda saqlashda paydo bo'ladi. Birinchi holda, zaif bog'lanish qiymatlar uchun, ikkinchidan, indekslar uchun maqbuldir.

Jadval elementlarining ob'ektlar bilan o'zaro bog'liqligi (qiymatlar va indekslar) uning metamadvalidagi __mode qator maydonining qiymati bilan belgilanadi. Agar bu maydonda "k" belgisi bo'lsa, unda indekslar (kalitlar) uchun havola zaif; agar u "v" belgisini o'z ichiga olgan bo'lsa, unda qiymatlar uchun havola zaif bo'ladi. Maydonda ikkala belgi ham bo'lishi mumkin, bu ham indekslar, ham qiymatlar uchun bo'sh birikmani hosil qiladi.

Agar biz zaif jadvallardan foydalansak, unda yo'qolgan maydonlar uchun standart qiymati bilan jadvalni moslashtirish bo'yicha yuqoridagi muammo uchun quyidagi echim berilishi mumkin:

Lokal defoltlar \u003d () setmetatable (standartlar, (__mode \u003d "k")) local mt \u003d (__index \u003d function (t) return defaults [t] end) function set_def (t, d) defaults [t] \u003d d setmetatable (t , mt) tugaydi

Zaif jadvallar meta jadvallarni saqlaydigan yana bir echim, ularning soni har xil standart qiymatlar soni bilan bir xil:

Local metas \u003d () setmetatable (metas, (__mode \u003d "v")) function set_def (t, d) local mt \u003d metas [d] if mt \u003d\u003d nil then mt \u003d (__index \u003d function () return d end) metas [d] \u003d mt end setmetatable (t, mt) end

Global kontekst

Barcha global o'zgaruvchilar odatdagi jadvalning maydonlari global kontekst... Ushbu jadvalga global o'zgaruvchan _G orqali kirish mumkin. Barcha global o'zgaruvchilar kontekst maydonlari bo'lgani uchun, _G._G \u003d\u003d _G.

Global kontekst global o'zgaruvchilarga dinamik ravishda yaratilgan nom bilan kirishga imkon beradi:

Val \u003d _G _G \u003d val

Global kontekst odatiy jadval bo'lgani uchun, meta-jadval unga mos kelishi mumkin. Quyidagi misol atrof-muhit o'zgaruvchilarini faqat o'qish uchun mo'ljallangan global o'zgaruvchilar sifatida global miqyosga kiritadi:

Mahalliy f \u003d funktsiya (t, i) return os.getenv (i) end setmetatable (_G, (__index \u003d f))

Xuddi shu usul sizga boshlanmagan global o'zgaruvchilarga kirishni rad etishga imkon beradi.

Paketlar

Paketlar global miqyosni ifloslantirmasdan, tegishli funktsiyalar to'plamini aniqlashning asosiy usuli hisoblanadi. Odatda, paket - bu global miqyosda ushbu paketning barcha funktsiyalarini o'z ichiga olgan bitta jadvalni belgilaydigan alohida fayl.

My_package \u003d () funktsiyasi my_package.foo () ... oxiri

Bundan tashqari, barcha funktsiyalarni mahalliy qilishingiz va eksport qilingan funktsiyalar jadvalini alohida-alohida shakllantirishingiz mumkin:

Lokal funktsiya foo () ... end mahalliy funktsiya paneli () ... end my_package \u003d (foo \u003d foo, bar \u003d bar,)

Paket talab () funktsiyasi yordamida yuklanadi va yuklash vaqtida ushbu funktsiyaga berilgan nom (u avtomatik ravishda qo'shiladigan kengaytmani o'z ichiga olmaydi) _REQUIREDNAME o'zgaruvchisi orqali mavjud:

Agar _REQUIREDNAME \u003d\u003d nil bo'lsa, run_some_internal_tests () tugaydi

Sinflar va ob'ektlar

Tbl: func () construct (funktsiyani e'lon qilishda va uni chaqirishda) ob'ekt sifatida jadval bilan ishlashga imkon beradigan asosiy imkoniyatlarni beradi. Asosiy muammo shu kabi xatti-harakatlar bilan ko'plab ob'ektlarni tug'dirishdir, ya'ni. bitta sinfdan kelib chiqqan:

Funksiyalar sinfi () cl \u003d () cl .__ indeks \u003d cl - cl metamadval sifatida ishlatiladi cl end funktsiyasi ob'ekti (cl, obj) obj \u003d obj yoki () - allaqachon o'rnatilgan maydonlar bo'lishi mumkin setmetatable (obj, cl) qaytish obj oxiri

Bu erda sinf funktsiyasi ob'ektning meta-jadvali bo'lishga tayyor bo'sh jadval yaratadi. Sinf usullari ushbu jadvalning maydonlari, ya'ni. class - bu ob'ektning usullarini va uning meta-usullarini o'z ichiga olgan jadval. Object () funktsiyasi belgilangan sinfning ob'ektini yaratadi - jadval o'z metamadvali sifatida ko'rsatilgan sinfga ega. Ikkinchi argument ob'ektning boshlangan maydonlarini o'z ichiga olgan jadval bo'lishi mumkin.

Some_Class \u003d class () funktsiyasi Some_Class: foo () ... end funktsiyasi Some_Class: new () qaytish ob'ekti (o'zini, (xxx \u003d 12)) oxiri x \u003d Some_Class: yangi () x: foo ()

Meros olish

Ta'riflangan dasturda sinf meta-jadvali ishlatilmay qoladi, bu esa merosni amalga oshirishni osonlashtiradi. Vorislik klassi sinf ob'ekti sifatida yaratiladi, shundan so'ng u __index maydonini meta-jadval sifatida ishlatilishi mumkin bo'lgan tarzda o'rnatadi:

Subclass (pcl) cl \u003d pcl: new () - cl .__ index \u003d cl - ni o'rnating va uni class return cl end qiling.

Endi siz meros qilib olingan sinfga yangi maydonlar va usullarni qo'shishingiz mumkin:

Der_Class \u003d subclass (Some_Class) funktsiyasi Der_Class: new () local obj \u003d object (self, Some_Class: new ()) obj.yyy \u003d 13 - yangi maydonlar qo'shing obj end funktsiyasi Der_Class: bar () ... end - va yangi usullari y \u003d Der_Class: yangi () y: foo () y: bar ()

Bu erda ahamiyatsiz bo'lgan yagona narsa - bu ajdodlar sinfidan new () funktsiyasidan foydalanish va keyin ob'ekt () funktsiyasini chaqirib meta jadvalini almashtirish.

Vorislik klassi ob'ekti usullariga kirishda ular avval meta-jadvalda qidiriladi, ya'ni. merosxo'r sinfining o'zida. Agar usul meros bo'lib o'tgan bo'lsa, unda bu qidiruv muvaffaqiyatsiz bo'ladi va meros sinfining meta-jadvaliga kirish mumkin, ya'ni. ajdodlar sinfiga.

Yuqoridagi umumiy echimning asosiy kamchiligi - bu ajdodlar sinfining new () funktsiyasiga parametrlarni o'tkazish mumkin emasligi.

Buyruq satrining argumentlari

Ishga tushirish paytida berilgan buyruq qatori argumentlari arg qatorining elementlari sifatida mavjud.

Maqola sizga yoqdimi? Do'stlar bilan bo'lishish uchun: