[Lua 연구 노트] Lua Advanced - 필수, 삼안 수술

여기에 이미지 설명을 삽입하세요.


필요하다

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로 설정하는 것은 해당 스크립트를 제거하는 것과 같습니다.packagetabletableloadedloadedrequire

변수가 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()에 저장되고 실행 후의 주소는 가 되며 전체 주소는 파일에 정의된 메소드 의 주소임을 알 수 있습니다 . 제거 후에도 파일 주소는 동일합니다 . 이는 동일한 이름의 변수가 실제로 재정의되었음을 보여줍니다. 소스코드를 본 적은 없지만 키워드문이 있는 파일을 제외한 파일은 순차적으로 실행되는 것이 아닐까 심각하게 의심이 듭니다.00C1C500requirea()00C1C660aaa.luaaexample.luaa00C1C660example.luarequire("aaa")localaaa.lua

_G테이블을 인쇄하여 local변수가 실제로 파일의 전역 변수에 저장되지 않았음을 발견했습니다. 그리고 local이 파일에 정의된 변수가 저장되지 않더라도 설명 _G테이블은 글로벌 변수를 저장하는 테이블이다.

요약하자면:

  • require("文件名")require 파일을 실행하여 내부 글로벌 변수를 얻을 수 있으며, 로컬 변수 이름이 반복되면 처음 할당된 값을 덮어쓰게 됩니다. 다른 파일에 정의된 변수에는 local액세스할 수 없습니다.
  • package하나이고 이라는 table또 다른 것을 저장합니다 . 이것은 스크립트 이름을 인덱스로 사용하여 스크립트를 저장합니다. 직접 nil로 설정하는 것은 스크립트를 제거하는 것과 같습니다.tableloadedloadedrequire

단락 판단은 삼항 연산자를 구현합니다.

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

위의 명령문은 삼항 연산자와 동일한 효과를 갖습니다.

추천

출처blog.csdn.net/milu_ELK/article/details/131964260