全変数の操作

skript 2.5.3 で試しました skriptの変数は hashmap と treemap の2つのマップ変数で管理されています 変数の名前の最後にアスタリスク(*)が来るときは treemap から参照されて、来ないときは hashmap から参照されます * はリスト変数のサブノードを取得するために予約されているので解析時にエラーが出ますが次のコードで回避できることがわかりました
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
グローバル変数のルートノードのリストを取得するコードです 変数の名前は内部で *::* として認識されます 最後に*が付く場合は指定のノードまで進むために :: で分割されて頭から探索します ノード名が*になると直ちに探索を中止して treemap を返すので2個目以降のノード名は処理されません なので、最初と最後に*が来る名前は全て同じ振る舞いをします
*::*
*::a::*
*::a::b::*
*::a::b::c::*
*::*
*::a::*
*::a::b::*
*::a::b::c::*
以上の仕様を利用して全変数を削除するコードを書いてみました
function delete_variables():
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
loop {_rootNodes::*}:
loop indexes of {%loop-value-1%::*}:
delete_nodes("%loop-value-1%::%loop-value-2%")
delete {%loop-value-1%}

function delete_nodes(nodes: text):
loop (indexes of {%{_nodes}%::*}):
delete_nodes("%{_nodes}%::%loop-value%")
delete {%{_nodes}%}
function delete_variables():
set {_} to "*"
set {_rootNodes::*} to indexes of {%{_}%::*}
loop {_rootNodes::*}:
loop indexes of {%loop-value-1%::*}:
delete_nodes("%loop-value-1%::%loop-value-2%")
delete {%loop-value-1%}

function delete_nodes(nodes: text):
loop (indexes of {%{_nodes}%::*}):
delete_nodes("%{_nodes}%::%loop-value%")
delete {%{_nodes}%}
delete_variables() すべての変数を削除します delete_nodes("a::b") a::bとそのサブノードを削除します
0 Replies
No replies yetBe the first to reply to this messageJoin
Want results from more Discord servers?
Add your server