2013-11-22 10 views
1

LuaInterface에서 사용자 데이터 형식에 액세스하는 것과 관련하여 질문이 있습니다. Lua에 C# Dictionary를 전달하고 ipairs를 사용하여 반복을 시도 할 때 ipairs는 userdata 객체가 아니라 테이블을 기대하기 때문에 오류가 발생합니다.Lua에서 사용자 데이터 속성 및 메서드에 액세스

루아에 전달하기 전에 사전 형식을 LuaTable 형식으로 변환하는 것이 하나 있다고 가정합니다. 그러나 userdata 형식을 넣으려면 루아에 사전 개체를 가져 와서 필드를 업데이트해야합니다. customType 객체를 호출하고 Lua에서 메소드를 호출합니다. 이것이 가능한지는 모르겠지만 그 사전을 LuaTable 문자열과 int로 변환하면 Lua의 customType과 직접 인터페이스 할 수있는 기회를 잃을 것입니다.

루아에서 userdata로 작업하는 방법에 대한 정보를 온라인으로 보았습니다. 그러나 실제로 루아와 C/C++ 및 스택을 통해 인터페이스를 발견 한 몇 가지 예가 있습니다. 또한, sizeof 메소드는 어떤 경우에는 사용되지만, C#에서는 쉬운 대안이 없습니다. 누군가 포인터를 좀 주시겠습니까? C의 User-Defined Types에있는 PIL 섹션도 별 도움이되지 않았습니다.

+0

C#을 사전에서 루아 테이블을 구성의 예 : http://stackoverflow.com/a/3050730/1150918 그리고 루아 테이블을 구축 C API를 사용하여 꽤 사소한 있습니다. 그 일을하는 신선한 예제 : http://stackoverflow.com/a/20148091/1150918 – Kamiccolo

+0

@ Kamiccolo, 사전을 복사하는 것은 예외를 얻는 루아에서이 코드를 실행하려고하면 원래 – finnw

답변

1

LuaInterface/NLua를 사용하여 콜렉션 요소를 반복하려면 ipairs 대신 luanet.each를 사용해야합니다. 사전에서 LuaTable을 만들 필요가 없습니다.

luanet.each는 , MoveNextCurrent을 사용하여 사전을 반복합니다.

 
function luanet.each(o) 
    local e = o:GetEnumerator() 
    return function() 
     if e:MoveNext() then 
     return e.Current 
    end 
    end 
end 

대신 for x in ipairs(dict) 사용 for x in luanet.each (dict)

참조 : https://github.com/NLua/NLua/blob/079b7966245cccb42c563abeb19290459e10934e/Core/NLua/Lua.cs#L245

+0

을 반복하는 것과 같지 않습니다. 시도 GetEnumerator (nil 값)를 호출합니다. 왜 그런지 모르겠다. System.Collections.Generic 어셈블리를로드하는 중입니다. –

+0

죄송합니다. C# 코드에 오류가있었습니다. –

+0

그러나 내 사전 유형이 인 경우에는 작동하지 않습니다. x는 [one, PointClick.Pause + testClass] 값을 반환합니다. testClass 속성 및 메서드에 액세스하려면 어떻게합니까? –