結論から言うと Roblox(Lua)では primitive_nameplayer_id のようなキー名は「文字列として書かなくてもよい」のは、Lua の
テーブル構文ルール(糖衣構文 / syntactic sugar) のおかげです。


🎯 結論:構文ルール(糖衣構文)のため

Lua ではテーブルを作るとき、次のような書き方が許されています:

1. キーが「有効な識別子」の場合は、文字列を書かなくてよい

local t = {
    primitive_name = motionName,
    player_id = 1,
}

これは糖衣構文で、実際には次と完全に同じ意味です:

local t = {
    ["primitive_name"] = motionName,
    ["player_id"] = 1,
}

🧠 なぜこれが許されるのか(Lua の仕様)

Lua のテーブルは「連想配列」ですが、
キーが Lua の識別子ルールに従っている場合だけ
key = value という短い書き方ができます。

識別子ルールとは:

  • 英字または _ で始まる
  • 英数字と _ のみで構成される
  • 予約語でない

primitive_nameplayer_id はこの条件を満たしているため、
["primitive_name"] と書かなくてもよいのです。


逆に、識別子でない場合は必ず文字列が必要

例:

local t = {
    ["脚を開く"] = true,   -- OK
    脚を開く = true,        -- ❌ エラー(識別子ではない)
}

🔍 あなたの LoveダンスOS 文脈での意味

LoveダンスOS のプリミティブ名は <脚を開く> のように
識別子ではない文字列 が多いので、Roblox に送るときは:

primitive_name = "<脚を開く>"

のように 必ず文字列で書く必要がある

しかし、今回の例の primitive_nameplayer_id
OS のメタ情報キーであり、識別子として合法なので
糖衣構文が使える、というだけです。


🪶 まとめ

  • primitive_name = ... は Lua の糖衣構文
  • 実際には ["primitive_name"] = ... と同じ
  • Lua の識別子ルールに合うキーだけがこの書き方を許される
  • LoveダンスOS のプリミティブ名は識別子ではないので文字列必須

次に深掘りするとしたら:

「LoveダンスOS のプリミティブ名を Lua の識別子に変換するべきか?」
「Roblox 側の JSON / Table 変換でどこまで文字列化するべきか?」

どちらを掘り下げたいですか。