Operador
Todos os operadores binários e unários do Lua estão disponíveis. Além disso, != é um alias para ~=, e \ ou :: podem ser usados para escrever uma chamada de função encadeada como tb\func! ou tb::func!. E o YueScript oferece alguns outros operadores especiais para escrever códigos mais expressivos.
tb\func! if tb ~= niltb::func! if tb != niltb\func! if tb ~= niltb::func! if tb != nilComparações encadeadas
Seção intitulada “Comparações encadeadas”Comparações podem ser encadeadas arbitrariamente:
print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5-- saída: true
a = 5print 1 <= a <= 10-- saída: trueprint 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5-- saída: true
a = 5print 1 <= a <= 10-- saída: trueObserve o comportamento de avaliação das comparações encadeadas:
v = (x) -> print x x
print v(1) < v(2) <= v(3)--[[ saída: 2 1 3 true]]
print v(1) > v(2) <= v(3)--[[ saída: 2 1 false]]v = (x) -> print x x
print v(1) < v(2) <= v(3)--[[ saída: 2 1 3 true]]
print v(1) > v(2) <= v(3)--[[ saída: 2 1 false]]A expressão do meio é avaliada apenas uma vez, em vez de duas vezes como seria se a expressão fosse escrita como v(1) < v(2) and v(2) <= v(3). No entanto, a ordem das avaliações em uma comparação encadeada é indefinida. É fortemente recomendado não usar expressões com efeitos colaterais (como impressão) em comparações encadeadas. Se efeitos colaterais forem necessários, o operador de curto-circuito and deve ser usado explicitamente.
Anexar à tabela
Seção intitulada “Anexar à tabela”O operador [] = é usado para anexar valores a tabelas.
tab = []tab[] = "Value"tab = []tab[] = "Value"Você também pode usar o operador spread ... para anexar todos os elementos de uma lista a outra:
tbA = [1, 2, 3]tbB = [4, 5, 6]tbA[] = ...tbB-- tbA agora é [1, 2, 3, 4, 5, 6]tbA = [1, 2, 3]tbB = [4, 5, 6]tbA[] = ...tbB-- tbA agora é [1, 2, 3, 4, 5, 6]Spread de tabela
Seção intitulada “Spread de tabela”Você pode concatenar tabelas de array ou tabelas hash usando o operador spread ... antes de expressões em literais de tabela.
Ao fazer spread em um literal de tabela com chaves (por exemplo, {...other}), tanto a parte de array quanto a parte hash da tabela Lua são copiadas.
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}Spread de tabela de lista
Seção intitulada “Spread de tabela de lista”Ao fazer spread em um literal de tabela com colchetes (por exemplo, [...other,]), apenas a parte de array é copiada.
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]Indexação reversa de tabela
Seção intitulada “Indexação reversa de tabela”Você pode usar o operador # para obter os últimos elementos de uma tabela.
last = data.items[#]second_last = data.items[#-1]data.items[#] = 1last = data.items[#]second_last = data.items[#-1]data.items[#] = 1Metatable
Seção intitulada “Metatable”O operador <> pode ser usado como atalho para manipulação de metatable.
Criação de metatable
Seção intitulada “Criação de metatable”Crie tabela normal com chaves vazias <> ou chave de metamétodo cercada por <>.
mt = {}add = (right) => <>: mt, value: @value + right.valuemt.__add = add
a = <>: mt, value: 1 -- definir campo com variável de mesmo nomeb = :<add>, value: 2c = <add>: mt.__add, value: 3
d = a + b + cprint d.value
close _ = <close>: -> print "fora do escopo"mt = {}add = (right) => <>: mt, value: @value + right.valuemt.__add = add
a = <>: mt, value: 1 -- definir campo com variável de mesmo nomeb = :<add>, value: 2c = <add>: mt.__add, value: 3
d = a + b + cprint d.value
close _ = <close>: -> print "fora do escopo"Acesso à metatable
Seção intitulada “Acesso à metatable”Acesse a metatable com <> ou nome do metamétodo cercado por <> ou escrevendo alguma expressão em <>.
-- criar com metatable contendo campo "value"tb = <"value">: 123tb.<index> = tb.<>print tb.value
tb.<> = __index: {item: "hello"}print tb.item-- criar com metatable contendo campo "value"tb = <"value">: 123tb.<index> = tb.<>print tb.valuetb.<> = __index: {item: "hello"}print tb.itemDesestruturação de metatable
Seção intitulada “Desestruturação de metatable”Desestruture a metatable com chave de metamétodo cercada por <>.
{item, :new, :<close>, <index>: getter} = tbprint item, new, close, getter{item, :new, :<close>, <index>: getter} = tbprint item, new, close, getterExistência
Seção intitulada “Existência”O operador ? pode ser usado em diversos contextos para verificar existência.
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!Em vez de uma série de chamadas de função aninhadas, você pode encaminhar valores com o operador |>.
"hello" |> print1 |> print 2 -- insere o item do pipe como primeiro argumento2 |> print 1, _, 3 -- pipe com um placeholder
-- expressão pipe em multilinhareadFile "example.txt" |> extract language, {} |> parse language |> emit |> render |> print"hello" |> print1 |> print 2 -- insere o item do pipe como primeiro argumento2 |> print 1, _, 3 -- pipe com um placeholder
-- expressão pipe em multilinhareadFile "example.txt" |> extract language, {} |> parse language |> emit |> render |> printCoalescência de nil
Seção intitulada “Coalescência de nil”O operador de coalescência de nil ?? retorna o valor do operando esquerdo se não for nil; caso contrário, avalia o operando direito e retorna seu resultado. O operador ?? não avalia seu operando direito se o operando esquerdo avaliar para não-nil.
local a, b, c, da = b ?? c ?? dfunc a ?? {}
a ??= falselocal a, b, c, da = b ?? c ?? dfunc a ?? {}a ??= falseObjeto implícito
Seção intitulada “Objeto implícito”Você pode escrever uma lista de estruturas implícitas que começa com o símbolo * ou - dentro de um bloco de tabela. Se você está criando objeto implícito, os campos do objeto devem estar com a mesma indentação.
-- atribuição com objeto implícitolist = * 1 * 2 * 3
-- chamada de função com objeto implícitofunc * 1 * 2 * 3
-- retorno com objeto implícitof = -> return * 1 * 2 * 3
-- tabela com objeto implícitotb = 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: { }-- atribuição com objeto implícitolist = * 1 * 2 * 3
-- chamada de função com objeto implícitofunc * 1 * 2 * 3
-- retorno com objeto implícitof = -> return * 1 * 2 * 3
-- tabela com objeto implícitotb = 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: { }