【Lua学習記】Lua上級 - 要、三眼視操作

ここに画像の説明を挿入します


必要とする

これがファイル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その中に別のtableoneが格納されているということですloaded。これにはloadedrequireスクリプト名をインデックスとしてスクリプトが格納されています。これを直接 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")順次実行されているのではないかと強く疑っています。localaaa.lua

_Gテーブルを印刷すると、local変数が実際にはファイルのグローバル変数に格納されていないことがわかりました。また、localこのファイルで定義した変数は保存されませんが、説明_Gテーブルはグローバル変数を格納するテーブルです。

要約すれば:

  • require("文件名")requireファイルを実行すると内部グローバル変数を取得できますが、ローカル変数名が重複すると最初に代入された値が上書きされます。他のファイルで定義された変数にlocalはアクセスできません。
  • packageこれは 1 つで、もう 1 つはという名前でtable格納されます。これにはスクリプト名をインデックスとしてスクリプトが格納されます。これを直接 nil に設定すると、スクリプトをアンインストールするのと同じになります。tableloadedloadedrequire

短絡判定は三項演算子を実装

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

上記のステートメントは、三項演算子と同じ効果があります。

おすすめ

転載: blog.csdn.net/milu_ELK/article/details/131964260