기사 디렉토리
필요하다
aaa.lua
파일 내용 입니다
aaa.lua:
a = 10
local b = 20
print("我是aaa")
example.lua
파일 내용 입니다
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
require를 사용한 후에는 다른 파일들이 직접 호출되어 실행되는 것을 볼 수 있다. 그리고 우리는 그 전역 변수에 직접 접근할 수 있고, 우리의 전역 변수가 덮어씌워졌다는 것을 알 수 있습니다. 그리고 그 지역 변수는 비공개와 같아서 이 파일에서 접근할 수 없습니다.
이 방법 으로 보면 하나이고 그 안에 또 하나가 저장 되어 있는 package.loaded
것으로 추측할 수 있는데 , 스크립트 이름을 인덱스로 하여 스크립트를 저장하는 방법인데, 직접 nil로 설정하는 것은 해당 스크립트를 제거하는 것과 같습니다.package
table
table
loaded
loaded
require
변수가 100에서 10으로 변경되는 이유는 무엇입니까? aaa.lua
변수 a가 호출되는 것이 아니라 example.lua
변수 a가 덮어쓰여지는 것 같아요 . 확인해 보겠습니다.
이것이 파일 aaa.lua
의 내용 입니다.
function a()
print("我是aaa")
end
print(a)
a()
example.lua
파일 내용 입니다
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
인쇄된 정보를 보면 처음에 정의한 메소드가 이 주소 a()
에 저장되고 실행 후의 주소는 가 되며 전체 주소는 파일에 정의된 메소드 의 주소임을 알 수 있습니다 . 제거 후에도 파일 주소는 동일합니다 . 이는 동일한 이름의 변수가 실제로 재정의되었음을 보여줍니다. 소스코드를 본 적은 없지만 키워드문이 있는 파일을 제외한 파일은 순차적으로 실행되는 것이 아닐까 심각하게 의심이 듭니다.00C1C500
require
a()
00C1C660
aaa.lua
a
example.lua
a
00C1C660
example.lua
require("aaa")
local
aaa.lua
_G
테이블을 인쇄하여 local
변수가 실제로 파일의 전역 변수에 저장되지 않았음을 발견했습니다. 그리고 local
이 파일에 정의된 변수가 저장되지 않더라도 설명 _G
테이블은 글로벌 변수를 저장하는 테이블이다.
요약하자면:
require("文件名")
require 파일을 실행하여 내부 글로벌 변수를 얻을 수 있으며, 로컬 변수 이름이 반복되면 처음 할당된 값을 덮어쓰게 됩니다. 다른 파일에 정의된 변수에는local
액세스할 수 없습니다.package
하나이고 이라는table
또 다른 것을 저장합니다 . 이것은 스크립트 이름을 인덱스로 사용하여 스크립트를 저장합니다. 직접 nil로 설정하는 것은 스크립트를 제거하는 것과 같습니다.table
loaded
loaded
require
단락 판단은 삼항 연산자를 구현합니다.
Lua에는 삼항 연산자가 없지만 논리적인 판단을 통해 삼항 연산자를 위장할 수 있습니다.
제가 [Lua Study Notes] Getting Started with Lua 에 쓴 내용을 인용하겠습니다.
논리적 판단(Lua는 매우 특별합니다. 이것이 더 중요합니다)
Lua는 false와 nil을 false로 간주하고 true와 non-nil을 true로 간주하므로 0도 true임을 의미합니다. 주목해야 할 유일한 점은 Lua에서 불평등은 각각 ~= 및 또는 아님이라는 것입니다.
接下来用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决定,因此输出结果一定是右值
上述语句输出 ?
위의 판단을 단락판정(Short Circuit Judge)이라고 하며, 삼항연산자를 구현하기 위해 단락회로(Short Circuit)를 사용할 수 있다.
x,y=1,2
res = (x > y) and "yes" or "no"
print(res)
x,y=2,1
print(res)
输出:
no
yes
위의 명령문은 삼항 연산자와 동일한 효과를 갖습니다.