mcpField
L
luau-core

luau-core

github.com/luumenlabs开发1346 次安装23 周前更新
代码仓库

关于 luau-core

luau-core 是用于处理 Luau 语法、语义、惯用写法和标准库的技能,适合无需涉及 Roblox 运行时 API、类型系统分析或性能调优的任务。

主要功能

  1. 01Luau 语法与语义指导
  2. 02惯用控制流与作用域
  3. 03表、迭代与元表
  4. 04标准库用法
  5. 05检查与 Lua 的兼容性

适用场景

  1. 01编写或修复纯 Luau 代码
  2. 02选择表与迭代模式
  3. 03检查 Lua 惯用写法能否用于 Luau

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/luumenlabs/luau-skills --skill luau-core

安装后在 Claude Code 中输入/luau-core确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
compatibility-notes.md
functions-tables-operators-scope-and-control-structures.md
getting-started-and-syntax.md
library-and-grammar-reference.md
metatables-and-userdata-concepts.md

详细介绍

luau-core

适用场景

当任务主要涉及纯 Luau 语言行为时,使用此技能:

  • 编写或修复纯 Luau 语法。
  • 选择符合惯用写法的控制流、变量作用域或函数结构。
  • 将表用作数组、字典或类对象值。
  • 正确使用标准库。
  • 使用元表实现索引、运算符、迭代或类对象模式。
  • 检查某个 Lua 特性或惯用写法是否与 Luau 兼容。

当任务主要涉及以下内容时,不要使用此技能:

  • Luau 类型注解、泛型、类型推断、类型细化或严格性策略。
  • 性能分析、优化策略或性能权衡。
  • Roblox 引擎 API、服务、事件、类、网络、数据或游戏玩法架构。

决策规则

  • 如果答案可以局限于纯 Luau 语法、语义、惯用写法和标准库用法,请使用此技能。
  • 如果任务核心涉及类型别名、注解、泛型、导出类型或分析器行为,请转交给 luau-types。
  • 如果任务核心涉及内存分配模式、热点循环、基准测试、性能分析或优化策略,请转交给 luau-performance。
  • 如果任务依赖 game、Instance、服务、远程调用、数据存储、UI、物理或其他 Roblox 运行时概念,请改用相应的 roblox/* 技能。
  • 如果请求混合了核心语言工作与范围外主题,只回答纯 Luau 部分,并明确排除其余内容。
  • 如果不确定,优先采用范围较窄的解读,并省略可能与其他技能重叠的内容。

指令

  1. 将 Luau 视为 Lua 5.1 加上选定的 Luau 扩展。除非 Luau 明确支持,否则不要假设它支持 Lua 5.2 及更高版本的特性。
  2. 默认优先使用 local 变量和 local function 声明。只有任务需要更大作用域时才使用全局变量。
  3. 保持控制流直接明了。优先使用常规的 if、elseif、else、循环、break 和 continue,而不是巧妙的布尔技巧。
  4. 使用 Luau 特有语法以提升正确性或可读性:
    • 使用 if ... then ... else ... 表达式,而不是用 a and b or c 模拟三元表达式。
    • 当左侧只应求值一次时,使用 += 等复合赋值。
    • 直接迭代表时,若 for k, v in table do 是最清晰的写法,则使用这种广义迭代方式。
  5. 有意地设计表的用途:
    • 将数组用于有序的数字序列。
    • 将字典用于键值查找。
    • 只有在自定义行为能显著改善 API 时,才使用基于元表的记录。
  6. 对概念上会传入 self 的方法,使用 : 定义和调用;对普通函数访问,使用 .。
  7. 如果标准库已有清晰表达某项操作的函数,优先使用内置库函数,而不是手写辅助函数。
  8. 谨慎且明确地使用元表。只定义抽象所需的元方法,避免令人意外的行为。
  9. 讨论兼容性时,及早指出不受支持的假设,例如 goto、位运算符、仅限整数的推理或完整 Lua 标准库的可用性。
  10. 所有示例都应与宿主环境无关,并且只使用纯 Luau。不要依赖 Roblox 引擎对象或服务。

使用参考资料

  • 打开 references/getting-started-and-syntax.md,了解语法形式、字面量、赋值、表达式形式以及 Luau 独有的语法扩展。
  • 打开 references/functions-tables-operators-scope-and-control-structures.md,了解核心执行模型:函数、闭包、表、真值判断、迭代和控制流。
  • 打开 references/metatables-and-userdata-concepts.md,了解元方法行为、类似对象的表模式、原始操作以及 userdata 的边界。
  • 打开 references/library-and-grammar-reference.md,了解标准库的选择,以及语句和表达式的简明语法提示。
  • 当请求比较 Luau 与 Lua,或涉及特定版本的行为时,打开 references/compatibility-notes.md。
  • 除非任务明确涉及其他技能的范围,否则不要打开或引用此技能之外的参考资料。

检查清单

  • 解决方案符合有效的 Luau 语法。
  • 明确指定作用域,并默认使用 local。
  • 控制流清晰,并使用最简单且正确的结构。
  • 有意选择表的用途:数组、字典或由元表支持的记录。
  • 迭代方式符合数据形状。
  • 正确使用标准库,且比自定义辅助函数更简单。
  • 元表行为应尽量精简、可预测;若不明显,应在代码中说明。
  • 不包含深入的类型系统内容。
  • 不包含性能调优建议。
  • 不包含 Roblox 引擎 API 或架构建议。

常见错误

  • 将 0 或 "" 视为假值。在 Luau 中,只有 false 和 nil 是假值。
  • 当 b 可能为 false 或 nil 时,用 a and b or c 代替三元表达式。
  • 误以为数组的索引从 0 开始,而不是从 1 开始。
  • 混用方法和函数语法,例如使用 : 定义,却使用 . 调用。
  • 依赖字典的迭代顺序。
  • 忘记缺失的函数参数会变成 nil,多余的参数会被忽略。
  • 应使用局部变量或闭包时却使用全局变量。
  • 对简单的数据容器过度使用元表。
  • 误以为 Luau 支持较新 Lua 版本的特性,例如 goto、位运算符或整数语义。

示例

使用 if 表达式,而不是布尔三元表达式技巧
local function labelScore(score)
    return if score >= 100 then "high" else "normal"
end
优先使用局部变量和直观的控制流
local function firstPositive(values)
    for _, value in values do
        if value > 0 then
            return value
        end
    end

    return nil
end
有意地使用表
local queue = {}

queue[#queue + 1] = "a"
queue[#queue + 1] = "b"

local first = table.remove(queue, 1)
对类似对象的表使用方法语法
local Counter = {}
Counter.__index = Counter

function Counter.new()
    return setmetatable({ value = 0 }, Counter)
end

function Counter:increment()
    self.value += 1
    return self.value
end
仅在明确需要相应行为时添加元表
local Range = {}
Range.__index = Range

function Range.new(minimum, maximum)
    return setmetatable({ minimum = minimum, maximum = maximum }, Range)
end

function Range:contains(value)
    return value >= self.minimum and value <= self.maximum
end

function Range:__tostring()
    return string.format("[%d, %d]", self.minimum, self.maximum)
end

评论

支持 Markdown