Lua'ya Giriş
Lua, veri açıklama olanakları ile genel prosedürel programlamayı desteklemek için tasarlanmış bir uzatma programlama dilidir. Lua, ihtiyacı olan herhangi bir program için güçlü, hafif bir betik dili olarak kullanılmak üzere tasarlanmıştır.
- Sözleşmeler
- Tipler ve Değerler
- Tablolar
- Değişkenler
- İfade
- Fonksiyonlar
- Kapsam Kuralları
- Hafıza Tahsisi
- Sözdizimi Karşılaştırma
- Lua İşlevleri
İleride kullanacağımız Corona SDK, Lua 5.1.3 sürümünü kullanıyor. Lütfen daha fazla ayrıntı için Lua 5.1 Referans Kılavuzuna bakın.
Sözleşmeler
Lua'daki isimler ( tanımlayıcı olarak da adlandırılır ), bir rakamla başlamamış herhangi bir harf, rakam ve alt çizgi olabilir. Bu, çoğu dilde adların tanımlanması ile çakışmaktadır. "Mektup" tanımı, geçerli yerel ayarlara bağlıdır: geçerli yerel ayar tarafından alfabetik olarak kabul edilen herhangi bir karakter tanımlayıcıda kullanılabilir. Tanımlayıcılar değişkenleri ve tablo alanlarını adlandırmak için kullanılır.
Aşağıdaki anahtar kelimeler ayrılmıştır ve ad olarak kullanılamazlar:
and break do else elseif end falsefor function if in local nil notor repeat return then true until while |
Aşağıdaki dizgiler diğer belirteçleri gösterir:
+ - * / % ^ #== ~= <= >= < > =( ) { } [ ]; : , . .. ... |
Lua bir olan harfe duyarlı dil: andayrılmış bir sözcüktür, ama Andve ANDiki farklı, geçerli isimlerdir. Kural olarak, alt çizgi ile başlayan ve ardından büyük harflerle (örneğin _VERSION) başlayan isimler Lua tarafından kullanılan dahili global değişkenler için ayrılmıştır.
Bir açıklama çift tire (başlar --yerde bir dize dışında). Çizginin sonuna kadar koşuyorlar. Sen ile onu çevreleyen tarafından bir kod tam bloğun yorum yapabilirsiniz --[[ve --]]. Aynı bloğu açmak için, ilk muhafazaya olduğu gibi, basitçe başka bir kısa çizgi ekleyin ---[[.
-- Single line commented out--[[ Entire block commented outprint( 10 )print( 15 )--]] |
Bir sayısal sabit isteğe bağlı bir ondalık kısmı ve isteğe bağlı bir ondalık üst ile yazılabilir. Lua ayrıca onlarla birlikte tam sayı onaltılık sabitleri de kabul eder 0x. Geçerli sayısal sabitlerin örnekleri:
3 3.0 3.1416 314.16e-2 0.31416E1 0xff 0x56 |
Tipler ve Değerler
Lua dinamik olarak yazılmış bir dildir . Bu, değişkenlerin tiplerinin olmadığı anlamına gelir; sadece değerler yapar. Dilde tür tanımları yoktur. Tüm değerler kendi türünü taşır.
Lua'daki tüm değerler birinci sınıf değerlerdir . Bu, tüm değerlerin değişkenlerde saklanabileceği, diğer işlevlere argüman olarak iletilebileceği ve sonuç olarak döndürülebileceği anlamına gelir.
İlgilenmeniz gereken temel türler:
-
nil -
nilesas özelliği diğer herhangi bir değerden farklı olacak olan değerin türü; genellikle yararlı bir değerin yokluğunu temsil eder. -
boolean - değerlerin tipi
falsevetrue. Her ikisi denilvefalsebir koşulu yanlış yapar; başka herhangi bir değer gerçek yapar. -
sayı - gerçek (çift duyarlıklı kayan nokta) sayılarını temsil eder.
-
string - karakter dizilerini gösterir. Lua 8-bit temizdir: dizeler, gömülü sıfırlar da dahil olmak üzere herhangi bir 8 bit karakter içerebilir .
-
function - daha fazla bilgi için İşlevler bölümüne bakın .
-
tablo - Lua'daki tek veri yapılandırma mekanizması. Daha fazla bilgi için Tablolar'a bakınız .
Lua, çalışma zamanında dize ve sayı değerleri arasında otomatik dönüşüm sağlar . Bir dizeye uygulanan herhangi bir aritmetik işlem, normal dönüştürme kurallarını izleyerek bu dizeyi bir sayıya dönüştürmeye çalışır. Tersine, bir dizgenin beklendiği yerde bir sayı kullanıldığında, sayı makul bir biçimde bir dizgeye dönüştürülür. Sayıların dizgelere nasıl dönüştürüldüğü konusunda tam kontrol için, string.format işlevini string kütüphanesinden kullanın.
Tablolar
Tablolar Lua'daki tek veri yapılandırma mekanizmasıdır. Onlar uygulamak ilişkilendirilebilir diziler diziler sayılarla ama dışında herhangi bir değerle sadece dizine eklenebilir, yani nil. Tablolar heterojen olabilir ve dışındaki tüm türlerin değerlerini içerebilir nil.
Kayıtları (özellikleri) temsil etmek için, Lua alan adını bir indeks olarak kullanır . Dil bu temsili a.namesözdizimi şekeri sağlayarak destekler a["name"].
Endeksler gibi, bir tablo alanının değeri hariç herhangi bir türde olabilir nil. Özellikle, işlevler birinci sınıf değerler olduğundan, tablo alanları işlevler içerebilir. Böylece tablolar da yöntemler taşıyabilir .
Tablolar nesnelerdir : değişkenler aslında bu değerleri içermez, yalnızca bunlara referanslar . Atama, parametre geçişi ve işlev dönüşleri her zaman bu değerlere yapılan referansları değiştirir; bu işlemler yapmak değil kopyanın her türlü ima.
Masa yapıcısı, içinde olduğu gibi parantez (kaşlı ayraçlar) kullanılarak yazılmıştır {}.
t = {} -- Create a tablek = "x"t[k] = 3.14 -- New table entry with key = "x" and value = 3.14print( t[k] ) --> 3.14print( t["x"] ) --> 3.14print( t.x ) --> 3.14t[2] = "foo" -- New table entry with key = 2 and value = "foo"print( t[2] ) --> "foo" |
Yukarıdaki örnekte, alan adı ile giriş "x"iki yolla ulaşılabilir: a kadar özelliği nokta işleci kullanılarak t.xve bir şekilde bir dizi indeksi kullanarak t["x"].
Yaygın bir hata şaşırtmak için t.xbirlikte t[x]. İlk eşdeğerdir t["x"]: dize tarafından indekslenmiş bir tablo "x". İkincisi, değişkenin değerine göre indekslenmiş bir tablodur x.
Birçok Corona API'sı nesneleri döndürür. Bu nesnelerin belgelenmiş özelliklerini tıpkı tablo özellikleri için olduğu gibi değiştirebilirsiniz. Hatta kendi özellikleri, yok ekleyebilir değil olduğu gibi bir alt çizgi ile özel özelliklerden herhangi birini önek t._custom = 10. Corona, alt çizgi ile başlayan herhangi bir mülk adını kullanma hakkını saklı tutar.
Değişkenler
Değişkenler, değerleri saklayan yerlerdir. Lua'da üç tür değişken vardır: global , yerel ve tablo alanları (özellikler). Başlatılmamış herhangi bir değişken nilvarsayılandır.
global
Global değişkenlerin bildirimlerine gerek yoktur. Sadece oluşturmak için bir değer atarsınız:
print( s ) --> nils = "One million dollars"print( s ) --> One million dollars |
Genel değişkenler, uygulamanız çalıştığı sürece yaşar. Genel bir değişkeni atayarak silebilirsiniz nil. Bu noktada, global değişken hiç başlatılmamış gibi davranır.
s = nilprint( s ) --> nil |
Yerel
Yerel değişkenler, yerel deyim kullanılarak bildirilir:
x = 1 -- Global variablelocal y = 10 -- Local variable |
Genel değişkenlerin aksine, yerel değişkenler yalnızca bildirildikleri blokta görünür. Kapsamı yerel değişken beyan sonra başlar ve blok sonunda sona erer.
a = 10local i = 1while ( i <= 10 ) do local a = i*i -- Different variable "a", local to this "while" block print( a ) --> 1, 4, 9, 16, 25, ... i = i + 1end print( a ) --> 10 (the global "a") |
Tablo Alanları
Tablo alanları sadece tablonun kendi unsurlarıdır. Değerleri bir alana atamak için dizinin içine indekslersiniz.
t = { foo="hello" } -- Create table with a single property "foo"print( t.foo ) --> "hello"t.foo = "bye" -- Assign a new value to property "foo"print( t.foo ) --> "bye"t.bar = 10 -- Create a new property named "bar"print( t.bar ) --> 10print( t["bar"] ) --> 10 |
İfade
Aritmetik operatörler
Lua, normal ikili aritmetik operatörlerini destekler:
| Şebeke | amaç |
|---|---|
+ |
ilave |
- |
çıkarma |
* |
çarpma işlemi |
/ |
bölünme |
% |
modülo |
^ |
üstalma |
Aynı zamanda birliği -(olumsuzlama) destekler .
-
İşlenenler sayılara dönüştürülebilen sayılar veya dizeler ise, tüm işlemlerin olağan anlamı vardır. Üsküleme, herhangi bir üs için işe yarar. Örneğin
x^(-0.5), kare kökün tersini hesaplarx. -
Modulo şöyle tanımlanır:,
a % b == a - math.floor(a/b)*bbölümü eksi sonsuzluğa doğru yuvarlayan bir bölümün geri kalanında olduğu gibi.
İlişkisel Operatörler
Lua'daki ilişkisel operatörler:
| Şebeke | amaç |
|---|---|
== |
eşittir |
~= |
eşit değil |
< |
daha az |
> |
daha büyük |
<= |
eşit veya daha küçük |
>= |
büyük veya eşittir |
Bu operatörler daima trueveya ile sonuçlanır false.
-
Eşitlik (
==) ilk önce işleç türlerini karşılaştırır . Türleri farklı ise, sonuçfalse. Aksi takdirde, işlenenlerin değerleri karşılaştırılır. -
Sayılar ve dizgiler her zamanki gibi karşılaştırılır. Nesneler referans ile karşılaştırılır: iki nesne yalnızca aynı nesne olduğunda eşit kabul edilir. Her yeni nesne oluşturduğunuzda, bu nesne önceden var olan nesnelerden farklıdır.
-
Otomatik dönüşüm kuralları eşitlik karşılaştırması için geçerli değildir . Böylece,
"0" == 0değerlendirirfalse.
Mantıksal operatörler
Lua mantıksal operatörleri and, orve not. Tüm mantıksal operatörler hem düşünün falseve nilgerçek olduğu kadar yanlış ve başka bir şey.
-
ve - birleşim operatörü
and, bu değerfalseveya isenil; Aksi takdirdeandikinci argümanını döndürür. -
veya -
orbu değernilve değerinden farklı ise , disjunction operatörü ilk argümanını döndürürfalse; Aksi takdirdeorikinci argümanını döndürür. -
değil - olumsuzluk operatörü
nother zaman döndürürfalseveyatrue.
Her ikisi de andve orkısayol değerlendirmesini kullanın - ikinci işlenen sadece gerekirse değerlendirilir.
10 or 20 --> 1010 or error() --> 10nil or "a" --> "a"nil and 10 --> nilfalse and error() --> falsefalse and nil --> falsefalse or nil --> nil10 and 20 --> 20 |
birbirine bağlama
Lua'daki dize birleştirme işleci, iki nokta ( ..) ile gösterilir. Her iki işlenen de dizge veya sayıysa, yukarıda belirtilen dönüşüm kurallarına göre dizgilere dönüştürülür.
local s = "foo".."10" |
Uzunluk Operatörü
Uzunluk operatörü, unary operatörü tarafından gösterilir #. Bir dize uzunluğu, bayt sayısıdır - her karakter bir bayt olduğunda dize uzunluğunun normal anlamı.
Bir tablonun uzunluğu , olmayan ve olduğu gibi therhangi bir tamsayı indeksi olarak tanımlanır ; eğer dahası olduğunu , sıfır olabilir. Düzenli bir dizi için 1'den belirli bir değere sahip olmayan bir dizi için, uzunluğu tam olarak budur , son değerinin dizinidir. Dizi "delik" varsa ( değerleri arasında diğer olmayan değerler) , daha sonra doğrudan önce gelen endeksleri herhangi biri olabilir değeri. Bu nedenle, dizinin sonu gibi herhangi bir değeri düşünebilir .nt[n]nilt[n+1]nilt[1]nilnnilnnnilnil#tnilnil
Öncelik
Lua'daki operatör önceliği, aşağıdaki listeyi izler, daha düşük önceliğe:
orand<,>,<=,>=,~=,==..+,-*,/,%not,#,-(Birli)^
Her zamanki gibi bir ifadenin önceliğini değiştirmek için parantez kullanabilirsiniz. Concatenation ( ..) ve exponentiation ( ^) operatörleri doğru bir ilişkiseldir. Diğer tüm ikili işleçler ilişkili bırakılmıştır.
Fonksiyonlar
Düz fonksiyonlar beklendiği gibi: giriş (parantez içinde) , fonksiyonlar bazı görevleri yerine getirir ve sonuçlar döndürülebilir.
Bir işlevi bildirmek için yaygın yöntemler şunlardır:
local function f ()--bodyendlocal f = function()--bodyendfunction f ()--bodyendf = function ()--bodyend |
İşlevler değişken olabilir, böylece bir tablo bunları özellikler olarak saklayabilir. Bu, bir tablonun çok esnek kullanımına izin verir. Mantıksal olarak fonksiyon ailesini bir tabloya, örneğin mathkütüphaneye gruplamak için kullanılabilir . Bu durumda 100'ün sinüsünü hesaplamak için yazardınız math.sin(100). Burada, mathsadece bir tablodur ve özellik sinasıl fonksiyondur.
Nesne Yöntemi
Lua'daki nesneler tablolarla temsil edilir. Görüntüleme nesneleri ve genel Çalışma Zamanı nesnesi tüm nesnelerdir . Gibi mathkütüphane, bu nesneler, benzer özellikler olarak hedef yöntemleri (örneğin yöntemleri) depolar. Bununla birlikte, anahtar anahtarlardan biri sözdizimidir. Lua'ya, bu işlevi yalnızca düz bir işlev olarak değil, bir nesne yöntemi olarak adlandırılmaya niyetli olduğunu söylemeniz gerekir . Bunu yapmak için, nokta :operatörü yerine colon ( ) operatörünü kullanmanız gerekir . Bu diğer dillerden farklı olabilir. Javascript ve Lua'nın sözdizimini karşılaştırın:
| JavaScript | almak |
|---|---|
object.translate( 10, 10 ); |
object:translate( 10, 10 ) |
Kapsam Kuralları
Lua, sözlüksel olarak kapsamlı bir dildir. Değişkenlerin kapsamı, bildirimlerden sonraki ilk açıklamada başlar ve bildirimi içeren en içteki bloğun sonuna kadar sürer.
x = 10 -- Global variabledo -- New block local x = x -- New "x" with value 10 print(x) --> 10 x = x+1 do -- Another block local x = x+1 -- Another "x" print(x) --> 12 end print(x) --> 11endprint(x) --> 10 (the global one) |
İlanı gibi içinde, dikkat edin local x = x, yeni, xilan edilen henüz kapsamında değildir ve bu nedenle ikinci xdış büyüklüğüyle ilgilidir.
Sözlüksel kapsam kuralları nedeniyle, yerel değişkenlere, kapsamları içinde tanımlanan işlevlerle serbestçe erişilebilir. Bir iç işlev tarafından kullanılan bir yerel değişken, iç işlev içinde bir değer artışına veya dış bir yerel değişken olarak adlandırılır .
Bir localifadenin her uygulamasının yeni yerel değişkenleri tanımladığına dikkat edin :
a = {}local x = 20for i = 1, 10 do local y = 0 a[i] = function () y = y+1; return x+y endend |
Döngü on kapak oluşturur (adsız işlevin on örneği). Bu kapakların her biri farklı bir ydeğişken kullanır , hepsi aynı paylaşır x.
Hafıza Tahsisi
Özellikle mobil cihazlar kullanım için sınırlı hafızaya sahiptir, bu nedenle uygulamanızın toplam hafıza alanının en aza indirilmesini sağlamak için özen gösterilmelidir.
Lua otomatik hafıza yönetimi yapar. Bu, yeni nesneler için bellek ayırma konusunda endişelenmenize gerek olmadığı anlamına gelir. Nesnelere artık ihtiyaç duyulmadığında da açıkça belleği boşaltmanız gerekmez. Lua, tüm "ölü" nesneleri (Lua'dan artık erişilemeyen nesneler) toplamak için zaman zaman bir çöp toplayıcıyı çalıştırarak belleği otomatik olarak yönetir . Lua tarafından kullanılan tüm hafıza otomatik yönetime tabidir. Bununla birlikte, Lua'ya çöpleri ne göz önünde bulundurması gerektiğini söylemek size kalmıştır. Örneğin, bir global değişkende saklanan hiçbir şey değildiruygulamanız bir daha kullanmasa bile, çöp olarak kabul edilir. Benzer şekilde, bir tabloda veya dizide depolanan herhangi bir şey, bu tablo / dizi çöp toplayıcı tarafından kaldırılamazsa, depolanan değişken / nesne başlangıçta yerel kapsamda bildirilse bile çöp olarak kabul edilmeyecektir. Her iki durumda da, nilbu pozisyonlara atanmak size kalmıştır . Bu, karşılık gelen hafızanın kilitlenmemesini ve çöp toplayıcı tarafından serbest bırakılmasını sağlar.
Görüntüleme nesnesi ek bir adım gerektirir. Önce kullanarak görüntüleme hiyerarşisi nesneyi kaldırmanız gerekir object:removeSelf()veya display.remove( object )o zaman onun referansını ayarlamak gerekir, nil.
myObject:removeSelf()-- OR...display.remove( myObject )myObject = nil |
Sözdizimi Karşılaştırma
Lua ve diğer diller arasındaki sözdizimindeki bazı farklılıklar dikkat çekicidir çünkü derleyici hatalarını önlemeye yardımcı olabilirler:
-
noktalı virgül - her ifadenin sonunda izleyen noktalı virgül (etkin bir kod satırı) Lua'da isteğe bağlıdır .
-
kaşlı ayraçlar -
{ }Değişken kapsamı tanımlamaya alışmaya alışkın olabilirsiniz . Lua'da, kodudove ile destekleyerek bunu yaparsınızend. Lua'daki parantezler masa yapıcıları olarak yorumlanır . -
if - o zaman - else - C, Java, Javascript, vb. den gelirseniz, yazılı olarak yapacağınız genel bir hata
ifveelseififadeler test koşullarınınthensonuna eklenmeyi unutuyorif/elseif. Bir diğer yaygın hata iseelse if, Lua'nın beklediği gibi istemeden (boşlukla) kullanılmasıdırelseif. -
diziler - Lua'da diziler 1 tabanlıdır . Teknik olarak, ile başlayan bir dizine indeksleyebilirsiniz
0. Ancak, Lua ve Corona API'leri bir tablonun ilk unsur olduğunu kabultolduğunut[1], değilt[0]. -
çoklu dönüş değerleri - Lua'daki alışılmadık ama kullanışlı bir özellik, bir fonksiyonun birden fazla sonuç döndürme yeteneğidir .
-
çoklu atama - çoklu atama değerleri değiştirmek için kullanışlı bir yol sunar. İfadesi
x,y = y,xtakas edecekxiçinyve tersi. -
üçlü operatör (
? :) - Lua, üçlü operatöre eşdeğer sunmaza?b:c. Lua deyim(a and b) or c,byanlış olmadığı sürece yakın bir yaklaşım sunar . Örneğin, Lua eşdeğermax = (x>y?x:y)olacaktırmax = ( x>y and x or y).
Lua İşlevleri
Temel Lua kütüphanesi birkaç temel işlev sunar. Güvenlik nedeniyle, dofile(), load(), ve loadfile()işlevleri Corona kullanılamaz. loadstring()desteklenir.
Bu kılavuzdaki içerik , Lua lisansı koşulları altında serbestçe kullanılabilen Lua 5.1 Referans Kılavuzundan alınmıştır .