本文整理汇总了Golang中github.com/aarzilli/golua/lua.State.Type方法的典型用法代码示例。如果您正苦于以下问题:Golang State.Type方法的具体用法?Golang State.Type怎么用?Golang State.Type使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/aarzilli/golua/lua.State
的用法示例。
在下文中一共展示了State.Type方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: ipairsAux
func ipairsAux(L *lua.State) int {
i := L.CheckInteger(2) + 1
L.PushInteger(int64(i))
L.PushInteger(int64(i))
L.GetTable(1)
if L.Type(-1) == lua.LUA_TNIL {
return 1
}
return 2
}
示例2: LuaToGo
// Convert a Lua value 'idx' on the stack to the Go value of desired type 't'. Handles
// numerical and string types in a straightforward way, and will convert tables to
// either map or slice types.
func LuaToGo(L *lua.State, t reflect.Type, idx int) interface{} {
var value interface{}
var kind reflect.Kind
if t != nil { // let the Lua type drive the conversion...
if t.Kind() == reflect.Ptr {
kind = t.Elem().Kind()
} else if t.Kind() == reflect.Interface {
t = nil
} else {
kind = t.Kind()
}
}
switch L.Type(idx) {
case lua.LUA_TNIL:
if t == nil {
return nil
}
switch kind {
default:
cannotConvert(L, idx, "nil", kind, t)
}
case lua.LUA_TBOOLEAN:
if t == nil {
kind = reflect.Bool
}
switch kind {
case reflect.Bool:
{
ptr := new(bool)
*ptr = bool(L.ToBoolean(idx))
value = *ptr
}
default:
cannotConvert(L, idx, "bool", kind, t)
}
case lua.LUA_TSTRING:
if t == nil {
kind = reflect.String
}
switch kind {
case reflect.String:
{
tos := L.ToString(idx)
ptr := new(string)
*ptr = tos
value = *ptr
}
default:
cannotConvert(L, idx, "string", kind, t)
}
case lua.LUA_TNUMBER:
if t == nil {
kind = reflect.Float64
}
switch kind {
case reflect.Float64:
{
ptr := new(float64)
*ptr = L.ToNumber(idx)
value = *ptr
}
case reflect.Float32:
{
ptr := new(float32)
*ptr = float32(L.ToNumber(idx))
value = *ptr
}
case reflect.Int:
{
ptr := new(int)
*ptr = int(L.ToNumber(idx))
value = *ptr
}
case reflect.Int8:
{
ptr := new(int8)
*ptr = int8(L.ToNumber(idx))
value = *ptr
}
case reflect.Int16:
{
ptr := new(int16)
*ptr = int16(L.ToNumber(idx))
value = *ptr
}
case reflect.Int32:
{
ptr := new(int32)
*ptr = int32(L.ToNumber(idx))
value = *ptr
}
case reflect.Int64:
{
ptr := new(int64)
*ptr = int64(L.ToNumber(idx))
//.........这里部分代码省略.........
示例3: register
func register(L *lua.State, table string, values Map, convertFun bool) {
pop := true
if table == "*" {
pop = false
} else if len(table) > 0 {
L.GetGlobal(table)
if L.IsNil(-1) {
L.NewTable()
L.SetGlobal(table)
L.GetGlobal(table)
}
} else {
L.GetGlobal("_G")
}
for name, val := range values {
t := reflect.TypeOf(val)
if t.Kind() == reflect.Func {
if convertFun {
L.PushGoFunction(GoLuaFunc(L, val))
} else {
lf := val.(func(*lua.State) int)
L.PushGoFunction(lf)
}
} else {
GoToLua(L, t, valueOf(val), false)
}
L.SetField(-2, name)
if t.Kind() == reflect.Func {
var lf func(*lua.State) int
if convertFun {
lf = GoLuaFunc(L, val)
} else {
lf = val.(func(*lua.State) int)
}
L.PushGoFunction(func(L *lua.State) (ret int) {
defer func() {
if err2 := recover(); err2 != nil {
GoToLua(L, typeof(err2), valueOf(err2), false)
ret = 1
return
}
}()
ret = lf(L)
pos := L.GetTop() - ret + 1
L.PushNil()
L.Insert(pos)
for i := 0; i < L.GetTop(); i++ {
fmt.Println(L.Typename(int(L.Type(i + 1))))
}
return ret + 1
})
L.SetField(-2, "safe_"+name)
}
}
if pop {
L.Pop(1)
}
}
示例4: luaToGo
func luaToGo(L *lua.State, t reflect.Type, idx int, visited map[uintptr]interface{}) interface{} {
var value interface{}
var kind reflect.Kind
if t != nil {
if t.Kind() == reflect.Ptr {
kind = t.Elem().Kind()
} else if t.Kind() == reflect.Interface {
// Let the Lua type drive the conversion.
t = nil
} else {
kind = t.Kind()
}
}
switch L.Type(idx) {
case lua.LUA_TNIL:
if t == nil {
return nil
}
switch kind {
default:
value = reflect.Zero(t).Interface()
}
case lua.LUA_TBOOLEAN:
if t == nil {
kind = reflect.Bool
}
switch kind {
case reflect.Bool:
ptr := new(bool)
*ptr = L.ToBoolean(idx)
value = *ptr
default:
value = reflect.Zero(t).Interface()
}
case lua.LUA_TSTRING:
if t == nil {
kind = reflect.String
}
switch kind {
case reflect.String:
tos := L.ToString(idx)
ptr := new(string)
*ptr = tos
value = *ptr
default:
value = reflect.Zero(t).Interface()
}
case lua.LUA_TNUMBER:
if t == nil {
// Infering the type here (e.g. int if round value) would break backward
// compatibility and drift away from Lua's design: the numeric type is
// specified at compile time.
kind = reflect.Float64
}
switch kind {
case reflect.Float64:
ptr := new(float64)
*ptr = L.ToNumber(idx)
value = *ptr
case reflect.Float32:
ptr := new(float32)
*ptr = float32(L.ToNumber(idx))
value = *ptr
case reflect.Int:
ptr := new(int)
*ptr = int(L.ToNumber(idx))
value = *ptr
case reflect.Int8:
ptr := new(int8)
*ptr = int8(L.ToNumber(idx))
value = *ptr
case reflect.Int16:
ptr := new(int16)
*ptr = int16(L.ToNumber(idx))
value = *ptr
case reflect.Int32:
ptr := new(int32)
*ptr = int32(L.ToNumber(idx))
value = *ptr
case reflect.Int64:
ptr := new(int64)
*ptr = int64(L.ToNumber(idx))
value = *ptr
case reflect.Uint:
ptr := new(uint)
*ptr = uint(L.ToNumber(idx))
value = *ptr
case reflect.Uint8:
ptr := new(uint8)
*ptr = uint8(L.ToNumber(idx))
value = *ptr
case reflect.Uint16:
ptr := new(uint16)
*ptr = uint16(L.ToNumber(idx))
value = *ptr
case reflect.Uint32:
ptr := new(uint32)
*ptr = uint32(L.ToNumber(idx))
//.........这里部分代码省略.........
示例5: LuaToGo
// Convert a Lua value 'idx' on the stack to the Go value of desired type 't'. Handles
// numerical and string types in a straightforward way, and will convert tables to
// either map or slice types.
func LuaToGo(L *lua.State, t reflect.Type, idx int) interface{} {
var value interface{}
var kind reflect.Kind
if t == nil { // let the Lua type drive the conversion...
switch L.Type(idx) {
case lua.LUA_TNIL:
return nil // well, d'oh
case lua.LUA_TBOOLEAN:
kind = reflect.Bool
case lua.LUA_TSTRING:
kind = reflect.String
case lua.LUA_TTABLE:
kind = reflect.Interface
default:
return NewLuaObject(L, idx)
}
} else if t.Kind() == reflect.Ptr {
kind = t.Elem().Kind()
} else {
kind = t.Kind()
}
switch kind {
// various numerical types are tedious but straightforward
case reflect.Float64:
{
ptr := new(float64)
*ptr = L.ToNumber(idx)
value = *ptr
}
case reflect.Float32:
{
ptr := new(float32)
*ptr = float32(L.ToNumber(idx))
value = *ptr
}
case reflect.Int:
{
ptr := new(int)
*ptr = int(L.ToNumber(idx))
value = *ptr
}
case reflect.Int8:
{
ptr := new(byte)
*ptr = byte(L.ToNumber(idx))
value = *ptr
}
case reflect.String:
{
tos := L.ToString(idx)
ptr := new(string)
*ptr = tos
value = *ptr
}
case reflect.Bool:
{
ptr := new(bool)
*ptr = bool(L.ToBoolean(idx))
value = *ptr
}
case reflect.Slice:
{
// if we get a table, then copy its values to a new slice
if L.IsTable(idx) {
value = CopyTableToSlice(L, t, idx)
} else {
value = unwrapProxy(L, idx)
}
}
case reflect.Map:
{
if L.IsTable(idx) {
value = CopyTableToMap(L, t, idx)
} else {
value = unwrapProxy(L, idx)
}
}
case reflect.Struct:
{
if L.IsTable(idx) {
value = CopyTableToStruct(L, t, idx)
} else {
value = unwrapProxy(L, idx)
}
}
case reflect.Interface:
{
if L.IsTable(idx) {
// have to make an executive decision here: tables with non-zero
// length are assumed to be slices!
if L.ObjLen(idx) > 0 {
value = CopyTableToSlice(L, nil, idx)
} else {
value = CopyTableToMap(L, nil, idx)
}
//.........这里部分代码省略.........