Lua是动态类型语言,包含8种基本数据类型。本节将深入分析每种类型的特点、内存表现及Android开发中的注意事项。
表示数据无效或不存在,常用于删除变量或表字段。
local var = nil
print(type(var)) -- 输出: nil
-- 在表中表示删除
local tbl = {x=1}
tbl.x = nil -- 移除x字段
只有true
和false
两个值,条件判断中nil
和false
为假。
local isAndroid = true
local isIOS = false
-- 逻辑判断
if isAndroid then
print("运行在Android平台")
end
Lua 5.4开始同时支持整数和浮点数,在Android开发中需注意与Java类型的转换。
-- 整数
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开发注意:
Lua字符串是不可变字节序列,在Android中处理需注意编码问题。
-- 基础声明
local str1 = "Hello"
local str2 = 'Android'
local multiLine = [[
第一行
第二行
]]
-- 常用操作
print(#str1) -- 长度 → 5
print(string.sub(str1, 2)) -- 子串 → "ello"
print(str1 .. str2) -- 拼接 → "HelloAndroid"
-- 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
函数是一等公民,可作为参数、返回值和表字段。
-- 定义函数
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
表是Lua唯一的数据结构,可同时作为数组和字典使用。
-- 数组式表
local colors = {"red", "green", "blue"}
print(colors[1]) -- 输出: red(索引从1开始)
-- 字典式表
local person = {
name = "张三",
age = 20,
["id"] = 1001 -- 复杂键名
}
-- 混合表
local mobile = {
"Android", -- 隐式键[1]
osVersion = "12",
[3] = "备用字段"
}
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
用于表示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")
表示独立的执行线程,用于实现协作式多任务。
local co = coroutine.create(function()
print("协程开始")
coroutine.yield()
print("协程恢复")
end)
coroutine.resume(co) -- 输出: 协程开始
coroutine.resume(co) -- 输出: 协程恢复
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