[Notas de estudo de Lua] Lua avançada - Requer operação trinocular

Insira a descrição da imagem aqui


Exigir

Este é aaa.luao conteúdo do arquivo

aaa.lua:
a = 10
local b = 20
print("我是aaa")

Este é example.luao conteúdo do arquivo

example.lua:
a = 100
print(a)
require("aaa") --require调用其他脚本文件
print(a)
print(b)
print("###我是分割线###")
print(package.loaded["aaa"]) -- true
package.loaded.aaa = nil --卸载脚本语句
print(package.loaded["aaa"]) --nil

输出:
100
我是aaa
10
nil
###我是分割线###
true
nil

Pode-se observar que após usar require, outros arquivos serão chamados e executados diretamente. E podemos acessar diretamente suas variáveis ​​globais e descobrir que nossas variáveis ​​globais foram substituídas, e suas variáveis ​​locais são como privadas e não podem ser acessadas por este arquivo.

A partir package.loadeddeste método, podemos adivinhar que packageé um , e outro tableestá armazenado nele . Este armazena o script com o nome do script como um índice. Defini-lo diretamente como nil é equivalente a desinstalar o script.tableloadedloadedrequire

Por que a variável a muda de 100 para 10? Acho que não é aaa.luaa variável a que é chamada, mas sim example.luaa variável a que é sobrescrita. Vamos verificar:
este é aaa.luao conteúdo do arquivo

function a()
    print("我是aaa")
end
print(a)
a()

Este é example.luao conteúdo do arquivo

function a()
    print("我是example")
end
print(a)
a()
require("aaa")
print(a)
a()
print(package.loaded["aaa"])
package.loaded.aaa = nil
print(a)
a()

输出:
function: 00C1C500
我是example
function: 00C1C660
我是aaa
function: 00C1C660
我是aaa
true
function: 00C1C660
我是aaa

Pode-se observar pelas informações impressas que primeiro o método que definimos a()é armazenado 00C1C500neste endereço, e o endereço requireapós a execução a()passa a ser 00C1C660, e o endereço inteiro é o endereço do aaa.luamétodo definido no arquivo a. Mesmo após a desinstalação, example.luao aendereço do arquivo ainda é o mesmo 00C1C660. Isso mostra example.luaque a variável com o mesmo nome foi de fato redefinida. Embora eu não tenha visto o código-fonte, suspeito seriamente que os arquivos , exceto aqueles com instruções de palavras-chave, require("aaa")sejam executados sequencialmente .localaaa.lua

Ao imprimir _Ga tabela, descobrimos que locala variável de fato não estava armazenada na variável global do arquivo. E mesmo que localas variáveis ​​definidas neste arquivo não sejam salvas, a _Gtabela de descrição é uma tabela que armazena variáveis ​​globais.

Resumindo:

  • require("文件名")Você pode executar o arquivo require e obter as variáveis ​​globais internas. Se o nome da variável local for repetido, o primeiro valor atribuído será substituído. Variáveis ​​definidas em outros arquivos localnão serão acessadas.
  • packageÉ um tablee armazena outro tablechamado loaded. Este loadedarmazena requireo script com o nome do script como um índice. Defini-lo diretamente como nil equivale a desinstalar o script.

Julgamento de curto-circuito implementa operador ternário

Não há operador ternário em Lua, mas podemos usar o julgamento lógico para disfarçar um operador ternário.
Deixe-me citar o que escrevi em [Notas de estudo de Lua] Introdução a Lua

Julgamento lógico (Lua é muito especial, isso é mais importante)

Lua considera falso e nil como falso, verdadeiro e não nulo como verdadeiro, então 0 significa que também é verdadeiro. A única coisa a notar é que em Lua a desigualdade é ~= e ou não respectivamente.

接下来用T代表真,F代表假,?代表任意bool
print(F and ?)
在进行and运算的时候,如果第一个值就为false,那输出值一定为false,?是什么都不影响了,所以结果一定为false,输出F即可
print(T and ?)
在进行and运算的时候,如果第一个值为true,我们依然无法确定输出值,此时我们需要知道?是true还是false
但是最后的运算结果一定是由?决定的,如果?为true运算就是true,问号为false运算就是false,所以and左值为真时,输出的结果一定是右值
因此该语句会输出 ?
print(T or ?)
同理,or运算中如果左值为true,结果一定为true,因此输出T即可
print(F or ?)
or运算中如果左值为false,最后结果则是由?是true还是false决定,因此输出结果一定是右值
上述语句输出 ? 

O julgamento acima é chamado de julgamento de curto-circuito. Podemos usar curto-circuito para implementar um operador ternário

x,y=1,2
res = (x > y) and "yes" or "no"
print(res)
x,y=2,1
print(res)

输出:
no
yes

A declaração acima tem o mesmo efeito que o operador ternário

Acho que você gosta

Origin blog.csdn.net/milu_ELK/article/details/131964260
Recomendado
Clasificación