Luaライブラリ 要注意点 ~Debugライブラリ~

os.clock

osライブラリのclockはベンチマークデバッグに利用できるので、osライブラリではなく、あえて、こちらに入れておく。

local x = os.clock() -- この行に来た瞬間のCPU時間
local s = 0
for i=1, 100000 do
   s = s + i
end
print(string.format("elapsed time: %.2f\n", os.clock()-x ))

debug.getinfo ([thread,] f [, what])

関数に関する情報を格納したテーブルを返します。
f の値として、関数を直接渡すか、 数値を指定することができます。
''数値は指定したスレッドのコールスタック上で実行中のレベル f の関数を表します。
レベル 0 は現在の関数 (getinfo 自身) で、レベル 1 は getinfo を呼んだ関数で、以下同様です。''
(スタックにカウントされない末尾呼び出しを除きます)。そうでなければ、date は現在時刻を書式化する。
format が `!´ で始まっていたら、日付は世界時 (Universal Time) で書式化される。
このオプション文字の後、 format が *t であれば、 date は以下のフィールドを持つテーブルを返す。

プロパティ意味
source関数の定義位置。
short_sourcesourceの短縮形。(今ひとつ存在意義は謎)
linedefined該当関数が定義されている行
lastlinedefined該当関数が定義されている最後の行
what関数の種類。"Lua"か"C"、メインチャンクの場合は"main"
debug.getinfo(print).what --> "C"
debug.getinfo(myfunc).what -->"Lua"

i = loadstring("return 3")
debug.getinfo(i).what --> "main"
name関数の妥当と思われる名前。数値を指定してgetinfoを呼び出した場合のみ機能する。
namewhatnameフィールドの種類。対象の関数が何者か。"global", "local", "method", "field", ""(空文字)
nups関数が持つ上位値の数。レベルと関連。
activelines関数のアクティブ行の集合のテーブル。デバッガでも作らない限り、まぁあまり気にしなくても良い。
func関数自身。これだけだと、一見無意味に思えるが、該当レベルで関数がアクティブだったらここに入るというフィルターがかかっている。

debug.getlocal ([thread,] f, local)

スタック上のレベル f の関数のインデックス local のローカル変数の名前と値を返します。 明示的なローカル変数だけでなく、 引数や一時変数などにもアクセスします。

最初の引数またはローカル変数はインデックス 1 で、 最後のアクティブな変数まで以下同様です。
負のインデックスを指定すると可変長引数を参照します。
'-1' は最初の可変長引数です。指定したインデックスの変数が存在しなければ nil を返し、
範囲外のレベルを指定した場合はエラーを発生します。 (レベルが有効かどうかを調べるには debug.getinfo を使ってください。)

'(' (開き括弧) で始まる変数名は内部の変数 (ループ制御変数、 一時変数、 可変長引数、 および C の関数のローカル変数) を表します。

引数 f に関数を指定することもできます。この場合は関数の引数の名前だけを返します。

function foo (a, b)
    local x
   do local c = a-b end
   local a = 1
   while true do
       local name, value = debug.getlocal(1,a)
       if not name then break end
       print(name, value)
       a = a + 1
   end
end

foo(10, 20)

--[[
  a    10
  b    20
  x    nil
  a    4
]]

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS