콘텐츠로 이동

Changelog (변경 이력)

버전 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는 사용자 실수로 깨진 자리를 대신 치우지 않습니다).