2016-07-01 2 views
1

私はテーブルの16進IDを取得する方法を知りたい。私がやっていることを知っている:ルア - テーブルの16進数の識別子を取得

local some_var = {} 
print (some_var) 

結果は、(例えば)である:

table: 0x21581c0 

私はtable:文字列なし進をしたいです。あなたは、私はそれらの文字を削除するには多分あなたのいくつかは、私は正規表現(または類似したもの)を作成することをお勧めすることを知っているが、私はそれを避けたい、とだけ複雑なパターンがなければ0x21581c0

おかげ

答えて

1

を、標準機能はhereと記載されています。スタンダードの「tostring」機能は、テーブルに表示される16進数を取得する唯一の方法です。

残念ながら、いずれの関数もすべてのテーブルに対して異なる処理を行う構成はありません。

しかし、修正のためにいくつかの点があります。独自の関数を作成し、毎回代わりに呼び出すことができます。また、グローバル変数printまたはtostringのいずれかを自分の関数に割り当てることもできます。または、tostringが必要な各テーブルに__tostringメタメソッドを設定すると、別の答えが返されます。これの利点は、1つのセットアップステップで必要なフォーマットが得られることです。欠点は、各テーブルを設定する必要があることです。

local function simplifyTableToString(t) 
    local answer = tostring(t):gsub("table: ", "", 1) 
    local mt = getmetatable(t) 
    if not mt then 
     mt = {} 
     setmetatable(t, mt) 
    end 
    mt.__tostring = function() return answer end 
end 

local a = {} 
local b = {}  
print(a, b) 
simplifyTableToString(a) 
print(a, b) 
+0

はい、私は正規表現のものを避けたかったのですが、別の方法はないようです。ありがとう – dani24

1

を取得します最初のスペースを検索し、それに続く部分の部分文字列を取得できます。

function get_mem_addr (object) 
    local str = tostring(object)  
    return str:sub(str:find(' ') + 1) 
end 

print(get_mem_addr({})) -- 0x109638 
print(get_mem_addr(function() end)) -- 0x108cf8 

この関数は、テーブルや関数で動作しますが、あなたはそれに何かを渡した場合、エラーを期待しています。

それとも、少し型チェックを使用することができます、グローバル変数「のtoString」を介して、呼び出す標準関数を参照するグローバルな「印刷」変数があり、標準的な実装では

function get_mem_addr (o) 
    return tostring(o):sub(type(o):len() + 3) 
end 
+0

これは__tostringメタテーブルを持つテーブルでは機能しません。私はCコードなしでこれについての解決法を知らない。 – moteus

0

私が使用しているLuaのバージョンでは、OPで指定されたテーブルIDは無効です(Robloxでは5.1)。有効なIDは、例のように9ではなく、長さ8です。いずれにせよ、string.subを使用して、後にあるサブ文字列を取得してください。

string.sub(tostring({}), 8) 

理由は、 'table:'は7文字であるため、インデックス8から16進値を返す文字列の最後までを取っています。

関連する問題