Operator
Semua operator biner dan unari Lua tersedia. Selain itu != adalah alias untuk ~=, dan \ atau :: bisa digunakan untuk menulis pemanggilan fungsi berantai seperti tb\func! atau tb::func!. YueScript juga menawarkan beberapa operator khusus lain untuk menulis kode yang lebih ekspresif.
tb\func! if tb ~= niltb::func! if tb != niltb\func! if tb ~= niltb::func! if tb != nilPerbandingan Berantai
Section titled “Perbandingan Berantai”Perbandingan bisa dirantai secara bebas:
print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5-- output: true
a = 5print 1 <= a <= 10-- output: trueprint 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5-- output: true
a = 5print 1 <= a <= 10-- output: truePerhatikan perilaku evaluasi perbandingan berantai:
v = (x) -> print x x
print v(1) < v(2) <= v(3)--[[ output: 2 1 3 true]]
print v(1) > v(2) <= v(3)--[[ output: 2 1 false]]v = (x) -> print x x
print v(1) < v(2) <= v(3)--[[ output: 2 1 3 true]]
print v(1) > v(2) <= v(3)--[[ output: 2 1 false]]Ekspresi tengah hanya dievaluasi sekali, bukan dua kali seperti jika ekspresi ditulis sebagai v(1) < v(2) and v(2) <= v(3). Namun, urutan evaluasi pada perbandingan berantai tidak didefinisikan. Sangat disarankan untuk tidak menggunakan ekspresi dengan efek samping (seperti print) di perbandingan berantai. Jika efek samping diperlukan, operator short-circuit and sebaiknya digunakan secara eksplisit.
Menambahkan ke Tabel
Section titled “Menambahkan ke Tabel”Operator [] = digunakan untuk menambahkan nilai ke tabel.
tab = []tab[] = "Value"tab = []tab[] = "Value"Anda juga bisa memakai operator spread ... untuk menambahkan semua elemen dari satu list ke list lain:
tbA = [1, 2, 3]tbB = [4, 5, 6]tbA[] = ...tbB-- tbA sekarang [1, 2, 3, 4, 5, 6]tbA = [1, 2, 3]tbB = [4, 5, 6]tbA[] = ...tbB-- tbA sekarang [1, 2, 3, 4, 5, 6]Penyebaran Tabel
Section titled “Penyebaran Tabel”Anda bisa menggabungkan tabel array atau tabel hash menggunakan operator spread ... sebelum ekspresi di literal tabel.
Saat melakukan spread ke literal tabel dengan kurung kurawal (misalnya {...other}), bagian array dan bagian hash dari tabel Lua akan disalin.
parts = * "shoulders" * "knees"lyrics = * "head" * ...parts * "and" * "toes"
copy = {...other}
a = {1, 2, 3, x: 1}b = {4, 5, y: 1}merge = {...a, ...b}parts = * "shoulders" * "knees"lyrics = * "head" * ...parts * "and" * "toes"
copy = {...other}
a = {1, 2, 3, x: 1}b = {4, 5, y: 1}merge = {...a, ...b}Penyebaran Tabel List
Section titled “Penyebaran Tabel List”Saat melakukan spread ke literal tabel dengan kurung siku (misalnya [...other,]), hanya bagian array yang disalin.
source = {1, 2, 3, name: "Yue"}fullCopy = {...source}listCopy = [...source,]-- fullCopy => {1, 2, 3, name: "Yue"}-- listCopy => [1, 2, 3]source = {1, 2, 3, name: "Yue"}fullCopy = {...source}listCopy = [...source,]-- fullCopy => {1, 2, 3, name: "Yue"}-- listCopy => [1, 2, 3]Indeks Balik Tabel
Section titled “Indeks Balik Tabel”Anda dapat menggunakan operator # untuk mendapatkan elemen terakhir dari tabel.
last = data.items[#]second_last = data.items[#-1]data.items[#] = 1last = data.items[#]second_last = data.items[#-1]data.items[#] = 1Metatable
Section titled “Metatable”Operator <> dapat digunakan sebagai pintasan untuk manipulasi metatable.
Pembuatan Metatable
Section titled “Pembuatan Metatable”Buat tabel normal dengan tanda kurung siku kosong <> atau kunci metamethod yang dikelilingi oleh <>.
mt = {}add = (right) => <>: mt, value: @value + right.valuemt.__add = add
a = <>: mt, value: 1 -- set field dengan variabel bernama samab = :<add>, value: 2c = <add>: mt.__add, value: 3
d = a + b + cprint d.value
close _ = <close>: -> print "out of scope"mt = {}add = (right) => <>: mt, value: @value + right.valuemt.__add = add
a = <>: mt, value: 1 -- set field dengan variabel bernama samab = :<add>, value: 2c = <add>: mt.__add, value: 3
d = a + b + cprint d.value
close _ = <close>: -> print "out of scope"Mengakses Metatable
Section titled “Mengakses Metatable”Akses metatable dengan <>, nama metamethod yang dikelilingi <>, atau menulis ekspresi di dalam <>.
-- dibuat dengan metatable yang berisi field "value"tb = <"value">: 123tb.<index> = tb.<>print tb.value
tb.<> = __index: {item: "hello"}print tb.item-- dibuat dengan metatable yang berisi field "value"tb = <"value">: 123tb.<index> = tb.<>print tb.valuetb.<> = __index: {item: "hello"}print tb.itemDestrukturisasi Metatable
Section titled “Destrukturisasi Metatable”Destrukturisasi metatable dengan kunci metamethod yang dikelilingi <>.
{item, :new, :<close>, <index>: getter} = tbprint item, new, close, getter{item, :new, :<close>, <index>: getter} = tbprint item, new, close, getterKeberadaan
Section titled “Keberadaan”Operator ? dapat digunakan dalam berbagai konteks untuk memeriksa keberadaan.
func?!print abc?["hello world"]?.xyz
x = tab?.valuelen = utf8?.len or string?.len or (o) -> #o
if print and x? print x
with? io.open "test.txt", "w" \write "hello" \close!func?!print abc?["hello world"]?.xyz
x = tab?.valuelen = utf8?.len or string?.len or (o) -> #o
if print and x? print x
with? io.open "test.txt", "w" \write "hello" \close!Piping
Section titled “Piping”Sebagai ganti serangkaian pemanggilan fungsi bersarang, Anda bisa mengalirkan nilai dengan operator |>.
"hello" |> print1 |> print 2 -- sisipkan nilai pipe sebagai argumen pertama2 |> print 1, _, 3 -- pipe dengan placeholder
-- ekspresi pipe multi-barisreadFile "example.txt" |> extract language, {} |> parse language |> emit |> render |> print"hello" |> print1 |> print 2 -- sisipkan nilai pipe sebagai argumen pertama2 |> print 1, _, 3 -- pipe dengan placeholder
-- ekspresi pipe multi-barisreadFile "example.txt" |> extract language, {} |> parse language |> emit |> render |> printNil Coalescing
Section titled “Nil Coalescing”Operator nil-coalescing ?? mengembalikan nilai dari operan kiri jika bukan nil; jika tidak, operator mengevaluasi operan kanan dan mengembalikan hasilnya. Operator ?? tidak mengevaluasi operan kanan jika operan kiri bernilai non-nil.
local a, b, c, da = b ?? c ?? dfunc a ?? {}
a ??= falselocal a, b, c, da = b ?? c ?? dfunc a ?? {}a ??= falseObjek Implisit
Section titled “Objek Implisit”Anda dapat menulis daftar struktur implisit yang diawali simbol * atau - di dalam blok tabel. Jika Anda membuat objek implisit, field objek harus berada pada indentasi yang sama.
-- assignment dengan objek implisitlist = * 1 * 2 * 3
-- pemanggilan fungsi dengan objek implisitfunc * 1 * 2 * 3
-- return dengan objek implisitf = -> return * 1 * 2 * 3
-- tabel dengan objek implisittb = name: "abc"
values: - "a" - "b" - "c"
objects: - name: "a" value: 1 func: => @value + 1 tb: fieldA: 1
- name: "b" value: 2 func: => @value + 2 tb: { }-- assignment dengan objek implisitlist = * 1 * 2 * 3
-- pemanggilan fungsi dengan objek implisitfunc * 1 * 2 * 3
-- return dengan objek implisitf = -> return * 1 * 2 * 3
-- tabel dengan objek implisittb = name: "abc"
values: - "a" - "b" - "c"
objects: - name: "a" value: 1 func: => @value + 1 tb: fieldA: 1
- name: "b" value: 2 func: => @value + 2 tb: { }