luau-core について
luau-coreは、Luauの構文、意味、慣用表現、標準ライブラリの使い方を扱うスキルです。RobloxランタイムAPI、型システムの分析、パフォーマンス調整を伴わないタスクが対象です。
主な機能
- 01Luauの構文と意味のガイダンス
- 02慣用的な制御フローとスコープ
- 03テーブル、反復、メタテーブル
- 04標準ライブラリの使い方
- 05Luaとの互換性の確認
活用シーン
- 01純粋なLuauコードの作成や修正
- 02テーブルと反復方法の選択
- 03Luaの慣用表現がLuauで使えるかの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ luumenlabs/ luau-skills --skill luau-coreインストール後、Claude Code で/luau-coreを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/compatibility-notes.mdfunctions-tables-operators-scope-and-control-structures.mdgetting-started-and-syntax.mdlibrary-and-grammar-reference.mdmetatables-and-userdata-concepts.md詳細
luau-core
使用する場面
主に純粋な Luau 言語の動作に関するタスクでは、このスキルを使用してください。
- 純粋な Luau の構文を記述または修正する。
- 慣用的な制御フロー、変数のスコープ、関数の構成を選ぶ。
- 配列、辞書、オブジェクトのような値としてテーブルを扱う。
- 標準ライブラリを正しく使用する。
- インデックス、演算子、反復、オブジェクトのようなパターンにメタテーブルを適用する。
- Lua の機能や慣用表現が Luau と互換性があるか確認する。
主に次の内容に関するタスクでは、このスキルを使用しないでください。
- Luau の型注釈、ジェネリクス、型推論、型の絞り込み、厳格性の方針。
- プロファイリング、最適化戦略、パフォーマンス上のトレードオフ。
- Roblox エンジンの API、サービス、イベント、クラス、ネットワーク、データ、ゲームプレイのアーキテクチャ。
判断基準
- 純粋な Luau の構文、セマンティクス、慣用表現、標準ライブラリの使用法だけで回答できる場合は、このスキルを使用してください。
- タスクの中心が型エイリアス、注釈、ジェネリクス、エクスポートされた型、アナライザーの動作である場合は、
luau-typesに引き継いでください。 - タスクの中心がメモリ割り当てのパターン、ホットループ、ベンチマーク、プロファイリング、最適化戦略である場合は、
luau-performanceに引き継いでください。 - タスクが
game、Instance、サービス、リモート、データストア、UI、物理演算、その他の Roblox ランタイムの概念に依存する場合は、適切なroblox/*スキルを使用してください。 - 依頼にコア言語の作業と対象外のトピックが混在している場合は、純粋な Luau の部分だけに回答し、残りは明示的に対象外としてください。
- 判断に迷った場合は、狭く解釈し、ほかのスキルと重なる可能性のある内容は省いてください。
指示
- Luau は Lua 5.1 に一部の Luau 拡張を加えたものとして扱ってください。Luau が明示的にサポートしていない限り、Lua 5.2 以降の機能を想定しないでください。
- 既定では
local変数とlocal function宣言を優先してください。より広いスコープがタスクで必要な場合に限り、グローバル変数を使用してください。 - 制御フローは直接的にしてください。巧妙なブール値のトリックより、通常の
if、elseif、else、ループ、break、continueを優先してください。 - 正確性や可読性が向上する場合は、Luau 固有の構文を使用してください。
a and b or cによる三項演算子の模倣ではなく、if ... then ... else ...式を使用する。- 左辺が一度だけ評価されるべき場合は、
+=などの複合代入を使用する。 - テーブルを直接反復する場合、それが最も明確な形式であれば、一般化された反復
for k, v in table doを使用する。
- テーブルは意図を明確にして使い分けてください。
- 順序付きの数値シーケンスには配列を使用する。
- キーによる検索には辞書を使用する。
- カスタムの動作によって API が大きく改善される場合に限り、メタテーブルを使ったレコードを使用する。
selfを概念的に渡すメソッドの定義と呼び出しには:を使用し、通常の関数アクセスには.を使用してください。- 標準ライブラリで処理を明確に表現できる場合は、自作のヘルパーより組み込みライブラリ関数を優先してください。
- メタテーブルは控えめかつ明示的に使用してください。抽象化に必要なメタメソッドだけを定義し、予想外の動作を避けてください。
- 互換性について説明するときは、
goto、ビット演算子、整数だけを前提とした考え方、Lua 標準ライブラリ全体へのアクセスなど、サポートされない前提を早い段階で指摘してください。 - すべての例はホスト環境に依存しない純粋な Luau にしてください。Roblox エンジンのオブジェクトやサービスに依存しないでください。
リファレンスの利用
- 構文形式、リテラル、代入、式の形式、Luau 固有の構文の追加については、
references/getting-started-and-syntax.mdを開いてください。 - 関数、クロージャ、テーブル、真偽値の判定、反復、制御フローといった実行モデルの基本については、
references/functions-tables-operators-scope-and-control-structures.mdを開いてください。 - メタメソッドの動作、オブジェクトのようなテーブルのパターン、raw 操作、userdata の境界については、
references/metatables-and-userdata-concepts.mdを開いてください。 - 標準ライブラリの選択と、文や式に関する簡潔な文法の確認には、
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 から始まると思い込むこと。Luau では 1 から始まります。
:で定義して.で呼び出すなど、メソッド構文と関数構文を混在させること。- 辞書の反復順序に依存すること。
- 関数の引数が不足すると
nilになり、余分な引数は無視されることを忘れること。 - ローカル変数やクロージャが適切な場面で、グローバル変数を使うこと。
- 単純なデータコンテナーにメタテーブルを過剰に使うこと。
goto、ビット演算子、整数の意味論など、新しい Lua の機能が Luau にも存在すると考えること。
例
真偽値を使った三項演算子風の処理ではなく、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 対応