【Roblox】Luauにreadonly(read)が追加されました
前書き
はじめに
こんにちは!ambrでRoblox開発をしているhoshino(Facebook)です!
2025/11にLuauの新しいType SolverがRobloxにもリリースされましたね!
新しい型レベル関数(Type Functions)が追加されたり、キャストの規則が変更されanyを経由する必要が減ったりと盛りだくさんのアップデートです!
本記事では、アップデート内容の中でも特に「Read-only Table Properties」についてご紹介します!
本題: Luauでreadonly(read)を使う
readonlyとは
その名のごとく、読み取り限定であることを表明するための修飾子です。
同名の概念はC#やTypeScriptなどにも採用されており、Immutableなプログラミングを行う際に非常に役に立ちます。
なお、Luauではreadonlyを表す修飾子の名前はreadです。
この概念についてはreadonlyと認識している方が多いと思うので、記事タイトルはreadonly(read)としました。
実際に書いてみる
Luauにおけるreadonlyは、tableのフィールドにread修飾子をつけることで実現できます。
ここからは実際に公式のサンプルを参考にしつつコードを書いてみましょう。
なお、New Type Solverを使うためにはStudioで該当の設定をオンにする必要があります。設定方法の詳細は公式記事をご参照ください。
-
read付きのテーブルを定義する
type TR = { read x: number, y: number } type TW = { x: number, y: number } local r1: TR = { x = 1, y = 2 } local w1: TW = { x = 1, y = 2 } -
テスト用関数を書いてみる
※ この例はサンプルのため、Immutabilityを意識していません。
local testFuncR = function(param: TR): () param.x = 3 param.y = 4 end local testFuncW = function(param: TW): () param.x = 5 param.y = 6 endこの時点で、
testFuncRには静的にエラーが出ます。

後述のフルサンプルで試すとわかりますが、
testFuncWにTR型の値を渡そうとした際も静的にエラーが出ます。 -
実行してみる
-
フルサンプル
--!strict type TR = { read x: number, y: number } type TW = { x: number, y: number } local r1: TR = { x = 1, y = 2 } local r2: TR = { x = 1, y = 2 } local w1: TW = { x = 1, y = 2 } local w2: TW = { x = 1, y = 2 } local testFuncR = function(param: TR): () param.x = 3 param.y = 4 end local testFuncW = function(param: TW): () param.x = 5 param.y = 6 end testFuncR(r1) testFuncW(r2) testFuncR(w1) testFuncW(w2) print("r1: ", r1) print("r2: ", r2) print("w1: ", w1) print("w2: ", w2) -
実行結果(抜粋・整形)
r1: ▼ { ["x"] = 3, ["y"] = 4 } - Server - Script:25 r2: ▼ { ["x"] = 5, ["y"] = 6 } - Server - Script:26 w1: ▼ { ["x"] = 3, ["y"] = 4 } - Server - Script:27 w2: ▼ { ["x"] = 5, ["y"] = 6 } - Server - Script:28
-
おわりに
本記事では、Luauの新しいType Solverの機能の1つ、「Read-only Table Properties」について説明しました。
非常に強力な性質であり、使うことでImmutableなプログラミングに一歩近づけます。
一方で、実行時には無視されるため過信は禁物です。外部エディタ連携などで静的なエラーを常に検出できる環境を構築するのがよいでしょう。
以上、最後まで読んでいただきありがとうございました!
Discussion