Skip to content

에러 코드 — Roblox: Elem·Claim·핸들러

This content is not available in your language yet.

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

setTimeout: func must be a function (got {typeof(func)}) — quad-roblox/src/EngineOps.luau

  • 언제: 백엔드가 심는 시간 op setTimeout(func, delay)의 func 자리가 함수가 아닐 때(Debounce/Throttle이 내부에서 이 op를 씁니다).
  • 고치려면: 함수를 넘기세요.
  • 참고: extend/01-backend-provider-contract — “5. 메타데이터 op와 시간 op”

setTimeout: delay must be a non-negative number (got {if type(delay) == "number" then tostring(delay) else typeof(delay)}) — quad-roblox/src/EngineOps.luau

  • 언제: setTimeout(func, delay)의 delay가 숫자가 아니거나, NaN이거나, 음수일 때.
  • 고치려면: 0 이상의 숫자를 넘기세요.
  • 참고: extend/01-backend-provider-contract — “5. 메타데이터 op와 시간 op”

clearTimeout: timeout must be a Timeout from setTimeout (got {typeof(timeout)}) — quad-roblox/src/EngineOps.luau

  • 언제: clearTimeout(timeout)에 setTimeout이 돌려준 Timeout 핸들이 아닌 값을 넘겼을 때 — 마커 필드(__quadTimeout)로 신원을 확인합니다.
  • 고치려면: setTimeout이 돌려준 값을 그대로 넘기세요.
  • 참고: extend/01-backend-provider-contract — “5. 메타데이터 op와 시간 op”

Event: handler for "{k}" must be a function (got {typeof(v)}) — quad-roblox/src/Handlers/Event.luau

  • 언제: q.Elem "<Class>" { EventName = v }에서 이벤트 이름 키의 값 v가 함수도, None/nil(연결 해제 전용)도 아닐 때.
  • 고치려면: 콜백 함수나 q.None/nil을 넘기세요.
  • 참고: Elem — 문자 키

Dispatch: this Instance is not claimed by quad - build it with q.Elem or take it over with Claim first (an Instance made by another quad module instance also counts as not claimed here, and so does a destroyed one - a destroyed Instance cannot be reused) — quad-roblox/src/Handlers/InstanceChild.luau

Slot: this element is not claimed by quad - build it with q.Elem or take it over with Claim first (an Instance made by another quad module instance also counts as not claimed here, and so does a destroyed one - a destroyed Instance cannot be reused) — quad-base/src/Slot/Elements.luau

  • 언제: 숫자 키 자리에 quad가 소유하지 않은 Instance(Instance.new나 다른 라이브러리가 만든 것, 다른 quad 모듈 인스턴스가 만든 것, 또는 이미 파괴된 것)를 놓았을 때.
  • 언제: quad 밖에서 만들어졌거나(Instance.new, 다른 라이브러리) 아직 Claim으로 넘겨받지 않은 값, 다른 quad 모듈 인스턴스가 만든 값, 또는 이미 파괴된 값을 Slot의 원소로 넣으려 할 때 — 죽음을 추적할 수 없는 값은 받지 않습니다.
  • 고치려면: q.Elem "<Class>" { ... }로 만들었거나 Claim으로 넘겨받은 Instance만 자식 자리나 Slot 원소로 놓으세요. quad가 대신 claim해 주지 않습니다.
  • 참고: Elem — 숫자 키, Slot — 원소 대수, Claim

Dispatch: cannot place an Instance inside itself or one of its own descendants (that would be a cycle) — quad-roblox/src/Handlers/InstanceChild.luau

  • 언제: q.debug가 켜져 있을 때, 어떤 Instance를 자기 자신이나 자기 자손의 숫자 키 자리에 자식으로 놓으려 할 때 — 놓이는 자리의 Instance에서 조상 사슬을 따라 올라가며 그 Instance를 만나는지 검사합니다. 조상 사슬 걷기라 debug 층에 있습니다 — 꺼 두면 Roblox 엔진의 … would result in circular reference 에러가 대신 멈춥니다. 다만 그 에러는 quad가 자리를 잡은 뒤에 나므로, 그 요소의 부기는 그 뒤로 믿을 수 없습니다(던진 뒤의 무결은 약속하지 않습니다).
  • 고치려면: 순환이 생기지 않게 트리 구조를 바꾸세요.
  • 참고: Elem — 숫자 키

OnChange: property name must be a non-empty string — quad-roblox/src/Handlers/OnChange.luau

  • 언제: q.OnChange "Class" "Name" (fn)의 이름 자리("Name")가 문자열이 아니거나 빈 문자열일 때.
  • 고치려면: 비어 있지 않은 프로퍼티 이름 문자열을 넘기세요.
  • 참고: q.OnChange "Class" "Name" (fn)

OnChange: callback for "{name}" must be a function (got {typeof(fn)}) — quad-roblox/src/Handlers/OnChange.luau

  • 언제: q.OnChange "Class" "Name" (fn)의 fn이 함수가 아닐 때.
  • 고치려면: (newValue) -> () 모양의 함수를 넘기세요.
  • 참고: q.OnChange "Class" "Name" (fn)

Out: property name must be a non-empty string — quad-roblox/src/Handlers/OnChange.luau

  • 언제: q.Out "Class" "Name" (src)의 이름 자리("Name")가 문자열이 아니거나 빈 문자열일 때.
  • 고치려면: 비어 있지 않은 프로퍼티 이름 문자열을 넘기세요.
  • 참고: q.Out "Class" "Name" (src)

Out: "{name}" needs a Source to write back into (got {got}) — quad-roblox/src/Handlers/OnChange.luau

  • 언제: q.Out "Class" "Name" (src)의 src가 Source가 아닐 때 — :Compute 결과 같은 읽기 전용 State는 Set이 없어 {got}가 "a read-only State (a :Compute result?)"로 나옵니다.
  • 고치려면: Source를 넘기세요.
  • 참고: q.Out "Class" "Name" (src)

nativeClaim: Instance is already claimed by quad — quad-roblox/src/LifetimeHandle.luau

  • 언제: 같은 Instance를 nativeClaim으로 두 번 claim할 때. 공개 경로(q.Claim을 두 번, New가 만든 인스턴스를 claim)는 Claim의 1패스가 isClaimed로 먼저 걸러 Quad0029를 내므로, 이 에러는 백엔드 op를 직접 부르거나 파괴된 인스턴스를 GC 전에 다시 claim하는 정의되지 않은 경로에서만 봅니다.
  • 고치려면: 이미 quad 소유인 Instance를 다시 claim하지 마세요.
  • 참고: extend/01-backend-provider-contract — “3. 판정·훅·조회 op”

bindLifetime: this Instance is not claimed by quad - it was not created or claimed through quad, or it has already been destroyed (a destroyed Instance cannot be reused) — quad-roblox/src/LifetimeHandle.luau

inst가 Instance가 아니면(평범한 테이블·문자열 키) 이유 절이 owner must be an Instance claimed by quad (got {typeof(inst)})로 바뀝니다.

  • 언제: q.Backend.bindLifetime(inst, value)의 inst가 이 백엔드의 quad 소유 요소가 아닐 때(quad 밖에서 만들어졌거나, 이미 파괴됐을 때). 직접 부르지 않아도 닿습니다 — q.Dispatch.process로 quad가 만들지도 Claim하지도 않은 Instance의 자리에 Effect처럼 수명에 묶이는 값을 놓거나, q.Backend.holdLifetime을 그런 Instance에 직접 부르면 같은 메시지가 납니다(메시지는 부르지 않은 bindLifetime을 말합니다). q.Bookkeeping.setLength에 State 길이를 넘기며 anchor를 생략했는데 ownerKey가 Slot이면 Instance가 아닌 키로 묶으려다 이 에러(owner must be … 꼴)가 납니다.
  • 고치려면: quad가 만들었거나 Claim으로 넘겨받은, 아직 살아 있는 Instance에만 값을 놓거나 묶으세요 — 밖에서 만든 Instance는 먼저 q.Claim으로 넘겨받으세요. setLength라면 ownerKey가 Slot일 때 anchor에 그 Slot이 붙은 물리 Instance를 넘기세요.
  • 참고: q.Backend.bindLifetime(inst, value)

quad-roblox: requires a quad-base matching version pattern '{VERSION_PATTERN}' (got '{tostring(q.Version)}') — quad-roblox/src/init.luau

  • 언제: q:UseProvider(QuadRoblox)에 넘긴 quad-base 모듈의 Version이 이 quad-roblox 사본이 요구하는 버전 패턴과 맞지 않을 때({VERSION_PATTERN}은 이 패키지에 박힌 상수, {tostring(q.Version)}은 넘어온 모듈의 실제 버전).
  • 고치려면: quad-base와 quad-roblox의 버전을 맞추세요 — 저장소 현재 패턴 "4.0^.0^" 기준으로 같은 메이저에서 4.0.0 이상의 릴리즈 빌드(하한은 bump마다 패치까지 올라갑니다). quad-base가 프리릴리즈(4.1.0-rc.1)면 꼬리 유무가 달라 이 조건을 만족해도 막히니, 그 rc를 정확히 적은 quad-roblox 빌드를 쓰세요(설치의 문법).
  • 참고: QuadRoblox

{fn}: the first argument must be a class name string (got {typeof(name)}) — quad-roblox/src/Surface/Runtime.luau

  • 언제: 클래스를 먼저 받는 생성자(q.Elem·q.Modifier·q.Spread·q.Mapper·q.OnChange·q.OnEvent·q.Out, q.ForClasses가 돌려주는 같은 이름들)의 첫 인자가 문자열이 아니거나 빈 문자열일 때. {fn}은 그 생성자 이름입니다. 런타임은 문자열인지만 봅니다 — 없는 클래스 이름은 타입 검사가 먼저 잡고, 런타임에선 엔진이 그 클래스를 만나는 자리(Instance.new, 시그널 조회)에서 엔진 에러가 납니다.
  • 고치려면: 클래스 이름 문자열을 먼저 넘기세요(q.Elem "Frame" { … }).

OnEvent: event name must be a non-empty string — quad-roblox/src/Handlers/OnEvent.luau

  • 언제: q.OnEvent "Frame" (name)의 이벤트 이름이 문자열이 아니거나 빈 문자열일 때.
  • 고치려면: 비어 있지 않은 이벤트 이름 문자열을 넘기세요(q.OnEvent "Frame" "MouseEnter" (fn)).

OnEvent: callback for "{name}" must be a function (got {typeof(fn)}) — quad-roblox/src/Handlers/OnEvent.luau

  • 언제: q.OnEvent "Frame" "MouseEnter" (fn)의 fn이 함수가 아닐 때.
  • 고치려면: 그 이벤트의 인자를 받는 함수를 넘기세요.

{fn}: each stage takes one argument - write q.{fn} "Class" "Name" (…) (3.3's q.{fn}(name, …) form is gone) — quad-roblox/src/Surface/Runtime.luau

  • 언제: q.OnChange·q.Out·q.OnEvent의 클래스 단계나 이름 단계에 인자를 둘 이상 넘겼을 때 — 흔히 3.3의 q.OnChange("Text", fn)을 그대로 둔 코드이거나, 손으로 옮기다 클래스만 앞에 붙인 q.OnChange "TextLabel" ("Text", fn)입니다. 앞의 꼴은 "Text"를 클래스 이름으로 받아 단계 함수를 돌려주고 뒤의 꼴은 콜백을 버리므로, 막지 않으면 그 함수가 요소에 놓여 한참 뒤 Dispatch에서 엉뚱한 에러가 납니다.
  • 고치려면: 클래스 → 이름 → 콜백 순서로 따로 부르세요(q.OnChange "TextLabel" "Text" (fn)). 옮기기는 scripts/migrate-3.4.py가 해 줍니다.