Diretório de artigos
Exigir
Este é aaa.lua
o conteúdo do arquivo
aaa.lua:
a = 10
local b = 20
print("我是aaa")
Este é example.lua
o 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.loaded
deste método, podemos adivinhar que package
é um , e outro table
está armazenado nele . Este armazena o script com o nome do script como um índice. Defini-lo diretamente como nil é equivalente a desinstalar o script.table
loaded
loaded
require
Por que a variável a muda de 100 para 10? Acho que não é aaa.lua
a variável a que é chamada, mas sim example.lua
a variável a que é sobrescrita. Vamos verificar:
este é aaa.lua
o conteúdo do arquivo
function a()
print("我是aaa")
end
print(a)
a()
Este é example.lua
o 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 00C1C500
neste endereço, e o endereço require
após a execução a()
passa a ser 00C1C660
, e o endereço inteiro é o endereço do aaa.lua
método definido no arquivo a
. Mesmo após a desinstalação, example.lua
o a
endereço do arquivo ainda é o mesmo 00C1C660
. Isso mostra example.lua
que 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 .local
aaa.lua
Ao imprimir _G
a tabela, descobrimos que local
a variável de fato não estava armazenada na variável global do arquivo. E mesmo que local
as variáveis definidas neste arquivo não sejam salvas, a _G
tabela 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 arquivoslocal
não serão acessadas.package
É umtable
e armazena outrotable
chamadoloaded
. Esteloaded
armazenarequire
o 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