Skip to content

에러 코드 — Tag·Attr

This content is not available in your language yet.

각 절은 ### QuadNNNN — 메시지 원문(자리표시자는 {…}), 언제 나는가, 어떻게 고치는가. 번호로 찾으려면 색인.

AttrKey: name must be a non-empty string — quad-base/src/Attr/Key.luau

{ctx}: attribute name cannot be empty — quad-base/src/Attr/init.luau

{ctx}: plain-table keys must be non-empty strings — quad-base/src/Attr/init.luau

{fnName}: name must be a non-empty string — quad-base/src/Attr/init.luau

  • 언제: q.AttrKey(name)에 넘긴 name이 문자열이 아니거나 빈 문자열일 때.
  • 언제: q.Attr(...)에 넘긴 Store가 선언한 이름(store:Names()) 중 빈 문자열이 있을 때. {ctx}는 부른 자리 이름(Attr)입니다. Store의 생성자와 :Of는 빈 문자열 이름을 Quad0193으로 먼저 막지만, 그 두 문 밖에서 직접 대입한 필드(store[""] = q.Source(2))는 막지 않으므로 그런 Store를 q.Attr에 넘기면 이 에러가 납니다.
  • 언제: q.Attr(...)에 넘긴 평범한 테이블(메타테이블 없는)의 키 중 문자열이 아니거나 빈 문자열인 것이 있을 때.
  • 언제: q.StringAttr/q.NumberAttr/q.BooleanAttr에 넘긴 name이 문자열이 아니거나 빈 문자열일 때. {fnName}은 부른 패밀리 이름입니다.
  • 고치려면: 이름과 평범한 테이블의 키를 비어 있지 않은 문자열로 쓰세요. Store의 필드는 직접 대입하지 말고 생성자나 store:Of(name)으로 만드세요.
  • 참고: q.AttrKey(name), q.Attr(...), q.StringAttr(name, value)

AttrKey: attribute "{k.Name}" is already bound by another owner — quad-base/src/Attr/Key.luau

  • 언제: 한 인스턴스의 같은 속성 이름을 서로 다른 두 주인이 동시에 주장할 때 — 먼저 그 이름을 차지한 쪽이 아직 자리에서 물러나지 않은 채로 다른 쪽이 같은 이름에 값을 놓으려 할 때입니다. 공개 q.AttrKey(name)는 이름별로 캐시돼 그 키를 붙든 동안 같은 이름에 다른 키 객체가 나오지 않으므로, 실제로 흔한 경로는 그룹 쪽입니다: 같은 이름을 가진 그룹 q.Attr(...) 둘을 한 인스턴스에 놓거나({ q.Attr({ Hp = 5 }), q.Attr({ Hp = 9 }) }), 그룹 q.Attr과 [q.AttrKey("Hp")] = …를 함께 놓는 경우입니다. 그룹은 이름마다 자기 전용 키를 쓰기 때문에, 메시지가 AttrKey를 말해도 사용자가 AttrKey를 직접 쓰지 않았을 수 있습니다. 또 하나의 원인은 엔진이 같은 이름의 쓰기를 한 번 거부한 뒤 같은 이름을 다시 놓는 경우입니다(아래 관측).
  • 고치려면: 한 인스턴스에서 한 속성 이름은 한 곳에서만 놓으세요 — 그룹 여럿이 같은 이름을 가지면 q.Attr.Overridden(...)으로 하나로 합쳐 놓거나(뒤 인자가 이깁니다), 먼저 것을 그 자리에서 물린 뒤에 다음 :Set에서 다시 놓으세요. 엔진이 값이나 이름을 거부했다면(아래 관측) 그 값·이름을 엔진이 받는 것으로 고치세요.
  • 관측(계약 아님): 이 에러가 한 번 나면 그 인스턴스의 해당 그룹은 부분만 써진 채 남고 앞선 이름들이 잠깁니다(정의되지 않은 동작). 엔진이 SetAttribute를 거부한 뒤(지원하지 않는 값 타입·이름 규칙)에도 같은 문구가 날 수 있습니다 — 이름이 먼저 주인에게 묶이고 그다음 엔진에 쓰기 때문이라, 값을 고쳐 다시 놓아도 “이미 다른 주인” 안내가 옵니다.
  • 참고: q.AttrKey(name)

{ctx}: attribute name "{name}" appears more than once — quad-base/src/Attr/init.luau

  • 언제: q.Attr.Merged(...)에 넘긴 여러 Attr 값이 같은 속성 이름을 중복해서 선언할 때. 내부 헬퍼 flattenArg가 overwrite=false로 Store나 평범한 테이블을 펼치다 같은 이름을 만나는 분기도 같은 번호이지만, [2026-11-04 기준] 공개 표면 중 그 조합에 닿는 호출은 없습니다 — q.Attr.Merged/q.Attr.Overridden은 인자를 Attr 값으로만 제한하고, 생성자 q.Attr(...)는 항상 overwrite=true로 부릅니다.
  • 고치려면: 이름이 겹치지 않게 하거나, 겹침을 허용하려면 q.Attr.Overridden을 쓰세요.
  • 참고: q.Attr.Merged(...)

{ctx}: attribute "{name}" cannot be a function - attribute values are raw values or State — quad-base/src/Attr/init.luau

  • 언제: 평범한 테이블 값 자리에 함수를 뒀을 때, 또는 q.Attr(store)로 넘긴 Store의 필드에 함수를 직접 넣었을 때 — 속성 값은 원시 값이거나 State/q.None이어야 합니다.
  • 고치려면: 함수 대신 값 자체나 State를 넘기세요.
  • 참고: q.Attr(...)

{ctx}: attribute "{name}" cannot be a table - attribute values are raw values, None or State (got {typeof(v)}) — quad-base/src/Attr/init.luau

  • 언제: 평범한 테이블 값 자리에 (None도 State도 아닌) 또 다른 테이블을 뒀을 때, 또는 q.Attr(store)로 넘긴 Store의 필드에 그런 테이블을 직접 넣었을 때 — 엔진은 그런 테이블을 속성 값으로 저장할 수 없습니다(Slot/Ref/Tween/Modifier 등이 여기 걸립니다).
  • 고치려면: 원시 값이나 State, q.None만 값 자리에 두세요.
  • 참고: q.Attr(...)

{ctx}: arguments must be Stores, Attr values or plain tables — quad-base/src/Attr/init.luau

  • 언제: q.Attr(...)에 Store/Attr/평범한 테이블이 아닌 다른 것을 넘겼을 때.
  • 고치려면: 인자를 그 세 종류 중 하나로 바꾸세요.
  • 참고: q.Attr(...)

Attr.Merged: arguments must be Attr values — quad-base/src/Attr/init.luau

  • 언제: q.Attr.Merged(...)에 Attr 값이 아닌 인자를 넘겼을 때.
  • 고치려면: 모든 인자를 q.Attr(...)로 만든 값으로 바꾸세요.
  • 참고: q.Attr.Merged(...)

Attr.Overridden: arguments must be Attr values — quad-base/src/Attr/init.luau

  • 언제: q.Attr.Overridden(...)에 Attr 값이 아닌 인자를 넘겼을 때.
  • 고치려면: 모든 인자를 Attr 값으로 바꾸세요.
  • 참고: q.Attr.Overridden(...)

{fnName}: value of "{name}" must not be nil - use None to delete — quad-base/src/Attr/init.luau

  • 언제: 타입드 Attr 패밀리(StringAttr/NumberAttr/BooleanAttr)의 값 자리에 리터럴 nil을 넘겼을 때 — 평범한 테이블은 nil을 담을 수 없어 항목이 조용히 사라지는 것을 막습니다.
  • 고치려면: nil 대신 q.None을 쓰세요(지우는 뜻입니다).
  • 참고: q.StringAttr(name, value)

{fnName}: value of "{name}" must be a {luaType}, State or None (got {typeof(value)}) — quad-base/src/Attr/init.luau

  • 언제: 타입드 Attr 패밀리의 값이 State도 q.None도 아니면서, 그 패밀리의 원시 타입(StringAttr이면 string 등)과 다를 때.
  • 고치려면: 값 타입을 맞추거나 State/q.None으로 감싸세요.
  • 참고: q.StringAttr(name, value)

Attr: the same group value is placed at two positions of this instance — quad-base/src/Attr/init.luau

  • 언제: 같은 Attr 그룹 값 객체(테이블 신원 기준)를 한 인스턴스의 서로 다른 두 props 자리에 동시에 놓았을 때.
  • 고치려면: 그 그룹은 한 자리에만 놓으세요. 자리마다 새 q.Attr(...)를 만들어 놓는 것은 답이 아닙니다 — 같은 이름을 두 그룹이 주장하게 돼 곧바로 Quad0002(다른 owner가 이미 묶음)가 납니다.
  • 참고: q.Attr(...)

Tag: names must be strings - an empty string is not a tag name — quad-base/src/Tag.luau

  • 언제: q.Tag(...)나 tag:Added/tag:Removed의 이름 자리에 빈 문자열 ""을 넘겼을 때.
  • 고치려면: 비어 있지 않은 이름을 쓰세요.
  • 참고: Tag

Tag: names must be strings, Tags, or a plain {...} list of those (got an AttrKey/Mapper descriptor) — quad-base/src/Tag.luau

Tag: names must be strings, Tags, or a plain {...} list of those (got {typeof(v)}) — quad-base/src/Tag.luau

Tag: names must be strings, Tags, or a plain {...} list of those (got a table with a metatable) — quad-base/src/Tag.luau

  • 언제: 이름 자리에 AttrKey/Mapper 같은 브랜드 테이블을 넘겼을 때 — 문자열도, Tag도, 평범한 리스트도 아닙니다.
  • 언제: 이름 자리에 문자열도, Tag도, 리스트도 아닌 값(숫자, 불린 등)을 넘겼을 때.
  • 언제: 이름 자리에 메타테이블이 달린 테이블을 넘겼을 때 — State나 Attr 같은 quad 값도 포함되고(q.Tag(state)도 이 에러입니다), q.None도 그렇습니다(q.Tag(q.None)·tag:Added(q.None) — None은 “없음” 인자가 아니라 메타테이블 있는 테이블; “없음”은 nil로). q.Tag(...)의 __call 인자는 타입 검사가 없어 strict도 잡지 못합니다. 문자열도, Tag도, 평범한 리스트도 아닙니다.
  • 고치려면: 문자열, Tag, 또는 그것들의 평범한(메타테이블 없는) {...} 리스트를 넘기세요. State를 따라가는 태그가 목적이었다면 문자열로 바꾸는 건 답이 아닙니다 — state:Compute(function(v) return q.Tag(v) end)를 숫자 키 자리에 놓으세요.
  • 참고: q.Tag(...names)

Tag: names must be strings, Tags, or a plain {...} list of those - a name list is an array, not a hash table — quad-base/src/Tag.luau

  • 언제: 이름 자리의 리스트가 배열이 아니라 해시 테이블(정수가 아니거나 1 미만인 키를 가짐)일 때.
  • 고치려면: 배열(1부터 연속된 정수 키)로 주세요.
  • 참고: q.Tag(...names)

Tag: names must be strings, Tags, or a plain {...} list of those - a name list cannot have nil holes — quad-base/src/Tag.luau

  • 언제: 이름 리스트 중간에 nil 구멍이 있을 때(항목 수와 최대 인덱스가 다를 때).
  • 고치려면: nil 대신 그 자리를 빼거나 실제 값을 채우세요.
  • 참고: q.Tag(...names)

Tag:Contains: names must be strings (got {typeof(name)} at argument {i}) — quad-base/src/Tag.luau

  • 언제: tag:Contains(...names)의 가변 인자 중 하나가 문자열이 아닐 때(nil 포함).
  • 고치려면: 검사할 이름을 전부 문자열로 넘기세요.
  • 참고: tag:Contains(...names)

Tag: Apply factory must be a function (got {typeof(factory)}) — quad-base/src/Tag.luau

  • 언제: tag:Apply(factory)의 factory 자리가 함수가 아닐 때.
  • 고치려면: 함수를 넘기세요.
  • 참고: tag:Apply(factory)

Tag.Merged: arguments must be Tag values — quad-base/src/Tag.luau

  • 언제: q.Tag.Merged(...tags)의 인자 중 nil이 아니면서 Tag도 아닌 값을 넘겼을 때 — Tag.Merged는 Tag만 받는 엄격한 철자입니다.
  • 고치려면: Tag 값만 넘기세요. 문자열이나 리스트를 섞고 싶으면 q.Tag(...)를 쓰세요.
  • 참고: q.Tag.Merged(...tags)

업데이트로 폐기되어 더는 나오지 않는 에러 번호입니다. 옛 번호를 만났다면 아래 목록에서 지금 쓰는 번호를 찾으세요.

폐기된 번호 목록
  • Quad0003 — 4.0.0부터 같은 실수는 Quad0001입니다. 옛 문구: {ctx}: attribute name cannot be empty
  • Quad0005 — 4.0.0부터 같은 실수는 Quad0004입니다. 옛 문구: Attr.Merged: attribute name "{name}" appears more than once
  • Quad0006 — 4.0.0부터 같은 실수는 Quad0001입니다. 옛 문구: {ctx}: plain-table keys must be non-empty strings
  • Quad0009 — 4.0.0부터 같은 실수는 Quad0004입니다. 옛 문구: {ctx}: attribute name "{name}" appears more than once
  • Quad0013 — 4.0.0부터 같은 실수는 Quad0001입니다. 옛 문구: {fnName}: name must be a non-empty string
  • Quad0201 — 이제 던지지 않습니다. 이름 리스트의 중첩 깊이에는 한도가 없고, 리스트가 자기 자신을 담는 것(t[1] = t)은 정의되지 않은 동작입니다 — 지금은 재귀가 스택을 넘쳐 quad 내부 줄의 에러로 끝납니다(관측 — 계약 아님). 이 번호는 다른 에러에 다시 쓰지 않습니다. 참고: q.Tag(...names). 옛 문구: Tag: names must be strings, Tags, or a plain {...} list of those - this list nests deeper than 64 levels (does it contain itself?)
  • Quad0204 — 4.0.0부터 같은 실수는 Quad0200입니다. 옛 문구: Tag: names must be strings, Tags, or a plain {...} list of those (got {typeof(v)})
  • Quad0237 — 4.0.0부터 같은 실수는 Quad0200입니다. 옛 문구: Tag: names must be strings, Tags, or a plain {...} list of those (got a table with a metatable)