콘텐츠로 이동

3.4.0 이후의 모든 버전

3.4.0

Added

  • q.NewModule() — 모듈 인스턴스를 새로 만드는 함수(3.3의 q.New() 자리 — 아래 Changed).
  • q.Raw — 백엔드가 타입드 표면을 짓는 base 원재료: q.Raw.Modifier(3.3의 q.Modifier 묶음), q.Raw.Spread, q.Raw.Mapper(3.3의 q.newMapperClass).
  • Spread — 요소 테이블처럼 쓴 테이블을 요소의 숫자 키 자리에 펼쳐 넣는 일회용 묶음(quad-roblox에서는 q.Spread "Frame" {…} — 아래 항목, base 원재료는 q.Raw.Spread {…}). 같은 키는 먼저 자리 잡은 쪽이 이기고(인라인 키가 맨 앞), Modifier보다 앞섭니다. 안에 놓인 Spread는 만들 때 펴지고, spread:Append(other)는 다른 Spread만 받아 끝에 더하며 아무것도 돌려주지 않습니다. 요소에 놓이거나 다른 Spread에 펴진 Spread는 잠겨 더 이상 :Append할 수 없습니다. q.debug이면 앞선 Spread에 밀려난 함수 값을 알립니다.
  • quad-roblox: 클래스를 먼저 받는 생성자 — q.Elem "Frame" {…}, q.Modifier "Frame" (), q.Spread "Frame" {…}, q.Mapper "Frame" (key) {…}, q.OnChange "Frame" "Text" (fn), q.Out "Frame" "Text" (src), 새 q.OnEvent "Frame" "MouseEnter" (fn)(같은 이벤트를 여러 번 걸 수 있는 배열부 디스크립터), 그리고 자기 클래스 맵으로 같은 표면을 받는 q.ForClasses<<Map>>(). 타입은 생성 파일이 아니라 여러분의 타입 검사기가 가진 Roblox 클래스 타입에서 타입 함수가 계산합니다 — 새 타입 솔버가 필요하고, 3.3에서 필수였던 한도 플래그 셋은 이제 권장입니다(기본 한도에서도 대부분 검사되지만, 조상 클래스의 Modifier<GuiObject> 같은 타입을 주석으로 단 자리는 “too complex”가 날 수 있습니다 — 설치 문서).
  • quad-roblox: 클래스를 인자로 받는 타입 이름 — Props<C>·PropsHashPart<C>·PropsArrayItem<C>·MapperProps<C>·ElemCtor<C>·PropertyMap<C>·Modifier<C>·ModifierInto<C>·Spread<C>·SpreadInto<C>·OnChangeDescriptor<K>·OnEventDescriptor<K>·ModifierField<T>·ModifierFieldOut<T>.
  • Quad0281 — q.OnChange·q.Out·q.OnEvent의 클래스 단계나 이름 단계에 인자를 둘 이상 넘기면(3.3의 q.OnChange("Text", fn) 꼴, 또는 q.OnChange "TextLabel" ("Text", fn)) 그 자리에서 알려 줍니다.

Changed

  • BREAKING quad-roblox: q.Declaration(D.Frame {…}·D.New·D.Modifier.<Class>·D.Mapper.<Class>·D.Mapper.Root)이 없어졌습니다 — q.Elem "Frame" {…}·q.Modifier "Frame" ()·q.Mapper "Frame" (key) {…}·q.MapperRoot를 쓰세요. scripts/migrate-3.4.py <폴더>가 대부분을 기계로 옮깁니다(--check로 미리 보기, 못 옮긴 자리는 보고).
  • BREAKING q.New() → q.NewModule(), q.Modifier(...)(타입 없는 base) → q.Raw.Modifier(...)(q.Modifier는 이제 q.Modifier "Frame" 꼴의 타입드 생성자), q.newMapperClass(name) → q.Raw.Mapper(name). 옮기는 법: 이름만 바꾸면 됩니다(변환 스크립트가 합니다).
  • BREAKING quad-roblox: q.OnChange(name, fn)·q.Out(name, src) → q.OnChange "Class" "Name" (fn)·q.Out "Class" "Name" (src). 클래스를 먼저 받아 그 클래스의 타입으로 검사합니다(3.3에서 클래스마다 타입이 다른 이름 여섯이 any였던 것과 q.Out이 그 이름에서 올바른 Source를 거부하던 것이 함께 풀립니다). 옮기는 법: 놓을 요소의 클래스를 앞에 적으세요.
  • BREAKING quad-roblox 타입: 클래스별 이름(FrameModifier·IntoFrame·FrameElem)과 생성 모듈의 이름(Declaration·DeclarationMapper·PropTypes·OnChangeFn·OutFn·Field<T>·FieldOut<T>), 자식 자리 유니언 NewChild가 없어졌습니다 — Modifier<Frame>·ModifierInto<Frame>·ModifierField<T>·PropsArrayItem<Frame>처럼 클래스를 인자로 받는 이름이 그 자리입니다. quad-types의 Field<T>/FieldOut<T>도 ModifierField<T>/ModifierFieldOut<T>가 됐습니다. quad-roblox 루트의 OnChangeDescriptor는 이름을 인자로 받는 OnChangeDescriptor<K>가 됐습니다(옮기는 법: 이름을 모르는 자리는 OnChangeDescriptor<string>).
  • BREAKING quad-roblox 타입: 컴포넌트가 Modifier를 받는 자리 ModifierInto<C>는 메소드 없는 마커입니다 — 3.3의 Into<Class>처럼 AsTextButton 메소드를 가진 값이면 무엇이든 받는 인터페이스가 아니어서, 직접 만든 커스텀 클래스 Modifier(q.Raw.Modifier.TypedFactory)는 그 자리에 바로 들어가지 않습니다. 옮기는 법: 넘기는 쪽에서 :AsTextButton()으로 내려서 넘기세요.
  • BREAKING quad-roblox 타입: 요소의 배열부가 무타입 base Modifier(q.Raw.Modifier(...), 3.3의 q.Modifier(...))를 받지 않습니다 — 필드가 하나도 검사되지 않는 자리라서입니다(런타임은 그대로 동작). 옮기는 법: 놓을 요소의 클래스로 q.Modifier "Frame" {…}처럼 만드세요(scripts/migrate-3.4.py는 그런 자리를 고치지 않고 보고합니다). 같은 이유로 q.Raw.Spread {…}도 받지 않습니다 — q.Spread "Frame" {…}를 쓰세요.
  • quad-roblox 타입: Modifier 변환 함수의 old와 mod:Peek의 결과에서 State·Tween 팔이 읽기 뷰(State는 Get만, Tween은 Value만)가 됐습니다 — 다른 메소드가 필요하면 q.isState(old)로 확인한 뒤 캐스트하세요.
  • Quad0026·Quad0029·Quad0034·Quad0106·Quad0108·Quad0219·Quad0241·Quad0063·Quad0264의 메시지가 새 이름(q.Elem·q.Raw.Mapper·q.NewModule())을 말하고, Quad0224(q.Out에 Source가 아닌 값)는 커리 꼴에 맞게 “second argument” 대신 "Text" needs a Source to write back into로 말합니다.

Fixed

  • slot:Lazy(fn)의 fn이 q.None을 돌려주는 것을 strict 타입 검사가 거부하던 것 — 런타임은 nil처럼 빈 내용으로 받는데 타입이 막았습니다. 이제 fn: () -> (SlotElement<T> | None)?입니다.
  • slot:Lazy의 fn이 이미 다른 자리에 마운트된 원소를 돌려줄 때 나는 Quad0156의 설명이 :List의 updateFn·State 원인만 말하던 것 — :Lazy 원인도 적습니다.
  • Quad0272(slot:Lazy의 fn이 값을 둘 이상 돌려줌)가 던진 뒤 fn이 만든 원소가 정리되지 않고 남는다는 것을 말하지 않던 것 — 메시지와 문서가 그 사실을 적습니다(동작은 그대로: quad는 사용자 실수로 깨진 자리를 대신 치우지 않습니다).

3.5.0

Added

  • q:GetOrCreate(key, build) — 모듈 인스턴스마다의 결과 캐시. 처음 부를 때 build(q)를 돌려 값을 기억하고, 같은 열쇠로 다시 부르면 그 값을 돌려줍니다. 컴포넌트 킷처럼 q를 넘겨받아 쓰는 코드가 모듈을 q의 팩토리로 만들 때 씁니다(require("./Common")(q)가 같은 q에서 한 벌만 만들어짐). 캐시는 인스턴스와 함께 수거되고, 만드는 중인 열쇠를 다시 부르면 에러입니다.
  • q:AssertProvider(name, versionPattern) — 받은 q에 필요한 백엔드가 맞는 버전으로 설치돼 있는지 확인하고, 아니면 “설정 모듈에서 UseProvider를 먼저”라고 알리며 던집니다. 프로바이더 함수가 아니라 이름과 버전으로 비교하므로 패키지 사본이 달라도 같은 백엔드로 알아봅니다.
  • q.Backend.provider — 프로바이더가 자기 이름과 버전({ name, version })을 적는 자리. quad-roblox는 설치 때 { name = "quad-roblox", version = <자기 버전> }을 적습니다. 직접 만든 프로바이더도 AssertProvider로 확인받으려면 여기에 적으세요.
  • QuadTypes.SlotCtx<Item, UD, T> — slot:List·slot:Single의 updateFn이 받는 ctx의 타입 이름(항목, 사용자 데이터, 원소 타입). 파일마다 같은 레코드를 다시 적던 자리를 type RowCtx = QuadTypes.SlotCtx<Row, nil, Instance> 한 줄로 쓸 수 있습니다.

Changed

  • quad(quad-base·quad-roblox)의 q.debug 진단 줄이 모두 [quad debug] 로 시작합니다 — Studio 출력에서 자기 print와 구분됩니다. 진단 문구를 통째로 비교하던 테스트는 접두를 넣거나 부분 일치로 바꾸세요.
  • Quad0076: 숫자 키 자리에 함수가 오면({ q.Elem "Frame" }처럼 호출을 빠뜨린 경우) 프로바이더 설정을 의심하라는 꼬리 대신 “호출하지 않은 생성자나 컴포넌트”를 묻는 꼬리를 붙입니다.
  • Quad0109·Quad0110·Quad0113(Observer): 메시지가 “콜백 안에서”뿐 아니라 “콜백이 앞서 던진 뒤”인 경우도 말합니다 — 던진 콜백은 실행 중 표시를 남깁니다.

4.0.0 Latest

Changed

  • 3.x 안정화 구간을 닫습니다. 이제 호환이 깨지는 변경은 메이저 버전에만 싣습니다 — 설치 줄은 ~3.5.0 대신 ^4.0.0으로 적으세요. q:AssertProvider나 커스텀 프로바이더에 3.x 패턴을 적어 둔 코드는 Quad0289·Quad0228로 막히니 4.0^.0^류로 바꾸세요. quad_error와 type_version_check는 이 릴리즈 뒤로 각자의 번호로 올라갑니다. 공식 킷 둘(qwreey/quad_kit_roblox_devui·qwreey/quad_kit_roblox_material)이 4.0.0으로 처음 게시됩니다.
  • BREAKING 에러 번호를 실수 단위로 합쳤습니다 — 같은 규칙을 어기면 경로·q.debug·Effect/Observer 차이와 상관없이 같은 번호입니다. 이제 어떤 실수가 어느 번호로 보고되는지는 계약이고(바꾸면 메이저), 메시지 문구는 계약이 아닙니다. 옮기는 법: 번호로 분기하던 코드가 있으면 아래 표대로 새 번호로 바꾸세요. 폐기된 번호는 레퍼런스 각 페이지 끝의 접힌 목록에 남아 새 번호를 가리키고 다른 뜻으로 재사용되지 않습니다.
폐기 새 번호
Quad0003 · Quad0006 · Quad0013 Quad0001
Quad0005 · Quad0009 Quad0004
Quad0043 · Quad0123 · Quad0252 Quad0018
Quad0158 · Quad0162 Quad0020
Quad0064 Quad0057
Quad0264 Quad0063
Quad0097 · Quad0116 · Quad0137 · Quad0274 · Quad0277 Quad0068
Quad0109 Quad0087
Quad0090 · Quad0110 · Quad0113 Quad0088
Quad0091 · Quad0111 · Quad0114 Quad0089
Quad0112 Quad0092
Quad0115 Quad0093
Quad0164 · Quad0165 · Quad0242 Quad0140
Quad0151 Quad0142
Quad0160 · Quad0172 Quad0156
Quad0171 Quad0170
Quad0182 · Quad0185 Quad0181
Quad0204 · Quad0237 Quad0200
Quad0211 Quad0209
Quad0241 Quad0219
Quad0231 · Quad0234 · Quad0235 Quad0230
Quad0233 Quad0232
Quad0245 Quad0244
  • Tween의 콜백 셋(Started·Completed·Cancelled), tween:Wrapped와 tween:Mapped의 wrap, q.ForClasses와 타입 함수가 계산하는 표면의 세부를 unstable로 표시했습니다 — SemVer 보증 밖이고, 바뀌면 이 파일의 Changed에 (unstable)을 달아 알립니다. 동작 변경은 없습니다.
  • Completed의 정의를 문서에 못 박았습니다 — 끝났는지는 Completed가 나왔는가로만 정하고, 프로퍼티가 목표에 닿았는지는 묻지 않습니다. Completed 전에 교체되거나 철거되면 언제나 Cancelled입니다. 그래서 엔진이 목표에 닿았지만 통지가 아직인 트윈을 교체하면 전에는 Completed였고 이제 Cancelled입니다(unstable — 실측에서 사용자 코드가 그 사이에 끼어든 경우는 없었습니다).