📚

【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で該当の設定をオンにする必要があります。設定方法の詳細は公式記事をご参照ください。

  1. 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 }
    
  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には静的にエラーが出ます。

    後述のフルサンプルで試すとわかりますが、testFuncWTR型の値を渡そうとした際も静的にエラーが出ます。

  3. 実行してみる

    • フルサンプル

      --!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なプログラミングに一歩近づけます。
一方で、実行時には無視されるため過信は禁物です。外部エディタ連携などで静的なエラーを常に検出できる環境を構築するのがよいでしょう。

以上、最後まで読んでいただきありがとうございました!

参考

ambr Tech Blog

Discussion