記事ディレクトリ
必要とする
これがファイル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
推測できるのは、package
それが one であり、table
その中に別のtable
oneが格納されているということですloaded
。これにはloaded
、require
スクリプト名をインデックスとしてスクリプトが格納されています。これを直接 nil に設定することは、スクリプトをアンインストールすることと同じです。
変数 a が 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
これは 1 つで、もう 1 つはという名前でtable
格納されます。これにはスクリプト名をインデックスとしてスクリプトが格納されます。これを直接 nil に設定すると、スクリプトをアンインストールするのと同じになります。table
loaded
loaded
require
短絡判定は三項演算子を実装
Lua には三項演算子はありませんが、論理的判断を使用して三項演算子を偽装することができます[Lua 学習ノート] Lua 入門に書いた
内容を引用させていただきます
論理的判断 (Lua は非常に特殊なので、こちらの方が重要です)
Lua は false と nil を false、true と非 nil を true とみなします。したがって、0 はそれも true であることを意味します。唯一注意すべきことは、Lua では不等号はそれぞれ~=と or not であるということです。
接下来用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决定,因此输出结果一定是右值
上述语句输出 ?
上記の判定を短絡判定といいますが、短絡を利用して三項演算子を実装することができます。
x,y=1,2
res = (x > y) and "yes" or "no"
print(res)
x,y=2,1
print(res)
输出:
no
yes
上記のステートメントは、三項演算子と同じ効果があります。