数据类型

       Lua是动态类型语言,包含8种基本数据类型。本节将深入分析每种类型的特点、内存表现及Android开发中的注意事项。

1. 基础类型

nil 空值

       表示数据无效或不存在,常用于删除变量或表字段。

local var = nil
print(type(var))  -- 输出: nil

-- 在表中表示删除
local tbl = {x=1}
tbl.x = nil  -- 移除x字段

boolean 布尔值

       只有truefalse两个值,条件判断中nilfalse为假。

local isAndroid = true
local isIOS = false

-- 逻辑判断
if isAndroid then
    print("运行在Android平台")
end

2. 数值类型

       Lua 5.4开始同时支持整数和浮点数,在Android开发中需注意与Java类型的转换。

number 数值

-- 整数
local intVal = 42
print(math.type(intVal))  -- 输出: integer

-- 浮点数
local floatVal = 3.14159
print(math.type(floatVal)) -- 输出: float

-- 数值运算
local ratio = screenWidth / screenHeight  -- 自动转为float
local px = math.floor(ratio * 100)       -- 取整

Android开发注意:

3. 字符串类型

       Lua字符串是不可变字节序列,在Android中处理需注意编码问题。

string 字符串

-- 基础声明
local str1 = "Hello"
local str2 = 'Android'
local multiLine = [[
第一行
第二行
]]

-- 常用操作
print(#str1)                -- 长度 → 5
print(string.sub(str1, 2))  -- 子串 → "ello"
print(str1 .. str2)         -- 拼接 → "HelloAndroid"

Unicode处理

-- UTF-8字符串
local emoji = "😂"
print(#emoji)  -- 输出: 4(字节数)
print(utf8.len(emoji))  -- 输出: 1(字符数)

-- 遍历UTF-8字符
for p, c in utf8.codes("中文") do
    print(string.format("%x", c))  -- 输出: 4e2d 6587
end

4. 函数类型

       函数是一等公民,可作为参数、返回值和表字段。

function 函数

-- 定义函数
local function onClick(event)
    print("点击坐标:", event.x, event.y)
end

-- 函数作为参数
local function setClickListener(callback)
    view.onClick = callback
end

-- 匿名函数
setClickListener(function(e)
    print("匿名函数处理点击")
end)

函数闭包

local function createCounter()
    local count = 0
    return function()
        count = count + 1
        return count
    end
end

local counter = createCounter()
print(counter())  -- 1
print(counter())  -- 2

5. 表类型

       表是Lua唯一的数据结构,可同时作为数组和字典使用。

table

-- 数组式表
local colors = {"red", "green", "blue"}
print(colors[1])  -- 输出: red(索引从1开始)

-- 字典式表
local person = {
    name = "张三",
    age = 20,
    ["id"] = 1001  -- 复杂键名
}

-- 混合表
local mobile = {
    "Android",  -- 隐式键[1]
    osVersion = "12",
    [3] = "备用字段"
}

表操作API

local t = {3, 1, 4}

table.insert(t, 2, 1.5)  -- 插入 → {3, 1.5, 1, 4}
table.remove(t, 3)       -- 删除 → {3, 1.5, 4}
table.sort(t)            -- 排序 → {1.5, 3, 4}

-- 遍历表
for k, v in pairs(t) do
    print(k, v)
end

6. 高级类型

userdata 用户数据

       用于表示C语言对象,在Android中通常对应Java对象。

-- 获取Java对象
local context = luajava.bindClass("android.content.Context")

-- 创建Java实例
local intent = luajava.newInstance("android.content.Intent")
intent:setAction("android.intent.action.VIEW")

thread 协程

       表示独立的执行线程,用于实现协作式多任务。

local co = coroutine.create(function()
    print("协程开始")
    coroutine.yield()
    print("协程恢复")
end)

coroutine.resume(co)  -- 输出: 协程开始
coroutine.resume(co)  -- 输出: 协程恢复

7. 类型转换与检测

       Lua与Java交互时的类型处理策略。

类型转换函数

-- Lua到Java
local javaInt = luajava.toJavaInteger(10)
local javaString = luajava.toJavaString("text")

-- Java到Lua
local luaNum = tonumber(javaObject:getValue())
local luaStr = tostring(javaObject)

类型安全检测

-- 检查Java对象类型
if luajava.instanceof(obj, "android.view.View") then
    obj:setVisibility(0)  -- View.VISIBLE
end

-- 参数类型检查
function safeCall(func, ...)
    if type(func) ~= "function" then
        error("参数必须是函数")
    end
    return func(...)
end

Android开发最佳实践