Rust: ๐Ÿ”ฌ ์ผ๋ฐ˜ ๊ด€๋ จ ์œ ํ˜•(GAT) ์ถ”์  ๋ฌธ์ œ

์— ๋งŒ๋“  2017๋…„ 09์›” 02์ผ  ยท  67์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

A-associated-items A-traits A-typesystem B-RFC-approved B-unstable C-tracking-issue E-mentor F-generic_associated_types T-compiler T-lang WG-compiler-traits requires-nightly

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656์€ (๋‹ค์†Œ ๊ฐ„๊ฒฐํ•œ) ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค.

67510์€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์ฃผ์š” ICE/๋ˆ„๋ฝ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  67 ๋Œ“๊ธ€

๋‹ค์Œ์€ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•  ์ผ์ข…์˜ ๊ตฌํ˜„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • [ ] 1๋‹จ๊ณ„: AST ๋ฐ pretty-printing์— ์ง€์› ์ถ”๊ฐ€

    • ์•„๋งˆ๋„ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์ƒˆ ์–‘์‹์˜ ๊ตฌ๋ฌธ ๋ถ„์„ ์„ ์‹œ์ž‘ํ•˜๊ณ  AST์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์—์„œ ์ด ๋Œ“๊ธ€์„ ์ฐธ์กฐํ•˜์„ธ์š” .

    • ์šฐ๋ฆฌ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ์ „์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  ์˜ˆ์œ ํ”„๋ฆฐํ„ฐ hir๋„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • HIR์„ ๋‚ฎ์ถ”๋ฉด GAT๊ฐ€ ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • [ ] ์•ž์œผ๋กœ ๋”

AST์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์˜ค๋Š˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠน์„ฑ ์ •์˜์˜ type Foo: Bar [= Baz]; ํ•ญ๋ชฉ์€ ์ด AST ๋ณ€ํ˜• ์— ์˜ํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ฒฝ๊ณ„( Bar )์™€ (์„ ํƒ ์‚ฌํ•ญ) ๊ธฐ๋ณธ๊ฐ’ Baz ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ TraitItem ๊ตฌ์กฐ์ฒด ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์„ฑ impl์˜ type Foo = Bar; ํ•ญ๋ชฉ์€ ์ด AST ๋ณ€ํ˜• ์— ์˜ํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. Foo ๋“ฑ์ด ImplItem ์— ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Bar ์œ ํ˜•๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ImplItem ๊ตฌ์กฐ์ฒด .

๋ฉ”์†Œ๋“œ๋Š” ์ด๋ฏธ ์ผ๋ฐ˜ํ™”๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฅ๋ฏธ๋กœ์šด ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” MethodSig ๊ตฌ์กฐ์˜ Generics ํ•„๋“œ ์— ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Generics ๊ตฌ์กฐ์ฒด ์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ Generics ๋ฉ”์„œ๋“œ ์—์„œ TraitItem (๋ฐ ImplItem )๋กœ "๋“ค์–ด์˜ฌ๋ ค" ๋ชจ๋“  ํ˜•์‹์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์„ฑ ๋ฐ ์ž„ํ”„ ํ•ญ๋ชฉ. ์ง€๊ธˆ์œผ๋กœ์„œ๋Š” ์ผ๋ฐ˜ ์ƒ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†”์งํžˆ ๋งํ•ด์„œ ์ด ์ƒ์ˆ˜๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ์ž‘์—…์—์„œ ๋น ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž‘์€ ํ™•์žฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ๊ณ„ํš๋งŒ ํ•˜๋ฉด ์ž‘์—…์ด ๋” ์ž˜ ๋  ๊ฒƒ ๊ฐ™์•„์š”.

์•„๋งˆ๋„ ๊ดœ์ฐฎ์€ ์ฒซ ๋ฒˆ์งธ PR์€ ๊ทธ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Generics ๋ฅผ TraitItem (๋ฐ ImplItem ) ๋ฐ MethodSig ์—์„œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ๋นˆ Generics ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ž‘์—…ํ•˜๊ณ  ์ œ๋„ค๋ฆญ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•„์š”์— ๋”ฐ๋ผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

@nikomatsakis ๋ฉ‹์ง€๋‹ค! ์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ์–ด์ ฏ๋ฐค์— ์ด๊ฒƒ์„ ์‹คํ—˜ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๋‚˜๋Š” ๋‹น์‹ ์ด AST์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ๋…ผํ‰์—์„œ ์ง€์ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ณณ์„ ์ฐพ์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ž๋ž‘์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :smile: (rusc์—์„œ ์ฒ˜์Œ ํ•ด๋ณด๋Š”๊ฑฐ๋ผ์„œ ์„ฑ์ทจ๊ฐ์ด ํฝ๋‹ˆ๋‹ค!)

์ œ๋„ค๋ฆญ์„ TraitItem ๋กœ ์˜ฌ๋ฆด ์ƒ๊ฐ์€ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์€ Generics ๋ฅผ TraitItemKind::Type ์— ๋„ฃ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฑฐ๊ธฐ์— ์œ ํ˜• ์„ ์–ธ์ด ์ด๋ฏธ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ๋ณด๋‹ค ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ํ•จ์ •์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์‚ฌ๊ณ  ๊ณผ์ •์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? : ์Šค๋งˆ์ผ :

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ๋ณ€๊ฒฝํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

pub enum TraitItemKind {
    // Generics aren't supported here yet
    Const(P<Ty>, Option<P<Expr>>),
    // `Generics` is already a field in `MethodSig`
    Method(MethodSig, Option<P<Block>>),
    // Added `Generics` here:
    Type(Generics, TyParamBounds, Option<P<Ty>>),
    Macro(Mac),
}

ํŽธ์ง‘: Gitter์—์„œ nikomatsakis์˜ ๋‹ต๋ณ€

๊ทธ๊ฒƒ๋“ค์„ ์œ ํ˜•์— ๋„ฃ๋Š” ๊ฒƒ์˜ ํ•จ์ •์— ๊ด€ํ•˜์—ฌ
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค
๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๊บผ๋ คํ–ˆ๋˜ ์ด์œ 
๋ฐฉ๋ฒ•๊ณผ ์œ ํ˜•์— ๋Œ€ํ•ด (์ ์–ด๋„ ์ด๋ก ์ƒ์œผ๋กœ๋Š”) ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  -- ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด -- ์›์น™์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ƒ์ˆ˜์— ๋Œ€ํ•ด ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์—†์„ ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ œ๋„ค๋ฆญ์„ ์œ ํ˜• ๋ณ€ํ˜•์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด
๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ "์œ ํ˜•/์ƒ์ˆ˜์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€, ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€"๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋” ๊ท ์ผํ•ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์†”์งํžˆ ์–ด๋–ป๊ฒŒ ๋ ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค =) -- ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‹น์‹ ์ด span_bug๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค! ์ง€๊ธˆ์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค(๋‚˜์ค‘์— ์™€์„œ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค)

๊ดœ์ฐฎ์•„! ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํŒŒ์„œ๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ํŒ์ž…๋‹ˆ๋‹ค. ํŠน์„ฑ ํ•ญ๋ชฉ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฃจํ‹ด์€ ํŠน์„ฑ ํ•ญ๋ชฉ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค . ์šฐ๋ฆฌ๋Š” type Foo<....> = ...; (์–ด์ฉŒ๋ฉด where-clauses)์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ด€๋œ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ€์ด์Šค ๋ฅผ ํ™•์žฅํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ( <...> ๋Š” ๋ฐฉ๊ธˆ AST์— ์ถ”๊ฐ€ํ•œ "์ œ๋„ค๋ฆญ"์ž…๋‹ˆ๋‹ค.)

ํ˜„์žฌ ๊ธฐ๋ณธ์ ์œผ๋กœ T: Foo ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” parse_ty_param ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ด€๋œ ์œ ํ˜• ์„ ์–ธ์˜ ๋ฌธ๋ฒ•์ด ๋” ์ด์ƒ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฌธ๋ฒ•๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ค‘๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ parse_trait_item_assoc_ty ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ parse_ty_param() ์˜ ๋ณต์ œ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ”๋กœ ์—ฌ๊ธฐ์—์„œ parse_generics() ๋ฅผ ํ˜ธ์ถœ ํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฃจํ‹ด์€ ์ œ๋„ค๋ฆญ ์„ ์–ธ( <...> )์ด ์žˆ์œผ๋ฉด ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋นˆ ์ œ๋„ค๋ฆญ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ”๋กœ ์—ฌ๊ธฐ ์— where ์ ˆ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธ์ถœ์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์ด์ „์— ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ generics ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ๋‚˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ๊ตฌ๋ฌธ ๋ถ„์„ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. src/test/run-pass/rfc1598-generic-associated-types/ ์™€ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ œ๋Œ€๋กœ ์ž‘๋™ ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฉ”์ธ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ src/test/ui/rfc1598-generic-associated-types/ ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค( UI ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€์— ๋Œ€ํ•œ ์ง€์นจ์€ COMPILER_TESTS.md ์ฐธ์กฐ).

๋‹ค๋ฅธ ๊ฒƒ -- ์‚ฌ๋žŒ๋“ค์ด ์•ˆ์ •์ ์ธ ๋นŒ๋“œ์—์„œ ์ด ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ด ์‹œ์ ์—์„œ ๊ฒŒ์ดํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ forge์— ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋งˆ์ง€๋ง‰ ์„น์…˜ ์ฐธ์กฐ). feature_gate.rs ์˜ ๋ฐฉ๋ฌธ์ž ์—๊ฒŒ visit_trait_item ๋ฐ visit_impl_item ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•ญ๋ชฉ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ œ๋„ค๋ฆญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ gate_feature_post ( ์˜ˆ์ œ )๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ ํ™•์ธ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ์ ์ ˆํ•œ "๊ฐˆ๋น„๋ผˆ"๋ฅผ ์ œ์ž๋ฆฌ์— ๋‘๋Š” ๊ฒƒ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค(์ด๋ฆ„ ํ™•์ธ ํ•ญ๋ชฉ์€ ๋ฒ”์œ„์— ์žˆ๋Š” ์ด๋ฆ„ ์ง‘ํ•ฉ์„ ๊ฐˆ๋น„๋ผˆ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฐˆ๋น„๋Š” ํ•˜๋‚˜์˜ ๋ฐ”์ธ๋”ฉ ์ˆ˜์ค€์„ ๋‚˜ํƒ€๋ƒ„). ์˜ˆ๋ฅผ ๋“ค์–ด impl์˜ ๊ฒฝ์šฐ:

impl<A,B> Foo<B> for Vec<A> {
   fn bar<T,U>(x: ...) { 
       for y in ... {
       }
   }
}

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐˆ๋น„๋ผˆ๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

- <A,B> (from the impl)
   - <T,U> (from the `bar` method's generics)
      - `x` (from the parameter list)
          - `y` (from the let)

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์•ฝ๊ฐ„์˜ "๋ฏธ๋ž˜ ๊ฒ€์ฆ"์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฉ”์„œ๋“œ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค(ํŠน์„ฑ์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์šฉ).

https://github.com/rust-lang/rust/blob/a35a3abcda67a729edbb7d649dbc663c6feabd4c/src/librustc_resolve/lib.rs#L1890 -L1892

๋ฐ˜๋ฉด์— ํŠน์„ฑ์— ์ •์˜๋œ type ์˜ ๊ฒฝ์šฐ ๋นˆ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ rib( NoTypeParameters )๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜๋“œ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/a35a3abcda67a729edbb7d649dbc663c6feabd4c/src/librustc_resolve/lib.rs#L1897 -L1901

์ด์ œ ์ œ๋„ค๋ฆญ์ด ๋ชจ๋“  ํŠน์„ฑ/impl ํ•ญ๋ชฉ์— ๋ฐฐ์น˜๋˜์—ˆ์œผ๋ฏ€๋กœ type ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋” ๋†’์€ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•˜๋„๋ก ๋ฉ”์„œ๋“œ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ํ•ญ๋ชฉ(์˜ˆ: const )์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ ๋„์ž…๋œ ๋ฆฌ๋ธŒ๋Š” ๋น„์–ด ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฌดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ํฌ๋งํ•ฉ๋‹ˆ๋‹ค).

๋‹ค๋ฅธ ๊ด€์‹ฌ ์ง€์ :

๋‹น์‹ ์€ ์•„์ด๋””์–ด๋ฅผ ์–ป์„.

@petrochenkov -- ์†Œ๋ฆฌ๊ฐ€ ๋งž๋‚˜์š”?

@nikomatsakis

๋งž๋Š” ์†Œ๋ฆฌ?

๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„. ํ‰์ƒ ํ•ด์ƒ๋„.

์ข‹๋“  ๋‚˜์˜๋“ , ์ด๊ฒƒ์€ ํ˜„์žฌ ๋‹ค๋ฅธ ์ด๋ฆ„ ํ™•์ธ๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋น„ํŠธ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” HIR์ด ๊ตฌ์„ฑ๋œ ํ›„์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์˜ ํ™•์‹คํžˆ ์ด๊ฒƒ์€ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ์•„์ง ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๋ฌผ์„ "๊ฐˆ๋น„๋ผˆ"๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ์˜คํžˆ๋ ค "๋ฒ”์œ„"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜์ ์ธ ์ด๋ฆ„ ํ™•์ธ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. =)

"๋Šฆ์€ ๋ฐ”์ธ๋”ฉ" ์ˆ˜๋ช…์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ์ธํ•ด ์•ฝ๊ฐ„์˜ ํ•ฉ๋ณ‘์ฆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ์‹ค์ œ๋กœ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๊ด€๋ จ ์œ ํ˜•์˜ ๋ชจ๋“  ์ˆ˜๋ช…์€ "์กฐ๊ธฐ ๋ฐ”์ธ๋”ฉ"๋˜๋ฉฐ, ์ด๋Š” ์ผ์ข…์˜ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. "๋Šฆ์€ ๊ฒฝ๊ณ„" ์ˆ˜๋ช…์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๊ฐ’์ด ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ๋˜๋Š” ํ•จ์ˆ˜์— ์„ ์–ธ๋œ ์ˆ˜๋ช…์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ์„ฑ์ด ๋†’์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‹ค๋ฅธ ์ด๋ฆ„ ํ™•์ธ๊ณผ ๋‹ฌ๋ฆฌ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ผ๋ฐ˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ชจ๋ธ์„ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋”ฐ๋ฅด๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ก€.

๋‹ค์Œ์€ ์ฝ”๋“œ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. impl , struct ๋˜๋Š” ๊ธฐํƒ€ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ํ•ญ๋ชฉ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ GAT์—์„œ์™€ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์œผ๋กœ Generics ์˜ ๋ชจ๋“  ์ˆ˜๋ช… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์™€ "์กฐ๊ธฐ ๋ฐ”์ธ๋”ฉ๋œ" ์ˆ˜๋ช…์— ๋งคํ•‘ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L370 -L388

๋จผ์ € ์ˆ˜๋ช… ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ๊ฐ์— ๋Œ€ํ•ด Region::early ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L376 -L378

๋‹ค์Œ์œผ๋กœ Scope ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. next_early_index ๋ณ€์ˆ˜๋Š” ๋ฒ”์œ„์— ์žˆ๋Š” ์ดˆ๊ธฐ ๋ฐ”์ธ๋”ฉ ์ˆ˜๋ช… ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ํ•ญ๋ชฉ์—๋งŒ ์ ์šฉ๋˜๋ฏ€๋กœ ํ•ญ์ƒ ํ˜„์žฌ ํ•ญ๋ชฉ์— ์„ ์–ธ๋œ ์ดˆ๊ธฐ ๋ฐ”์ธ๋”ฉ ์ˆ˜๋ช…์˜ ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. (๋‚˜์ค‘์— ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ ์ˆ˜๋ช…์„ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ GAT์— ๋” ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L379 -L384

๋งˆ์ง€๋ง‰์œผ๋กœ with() ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋กœ์ € ๋‚ด์—์„œ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ชจ๋“  ์ˆ˜๋ช…์€ ๋ฒ”์œ„๋กœ ์ •์˜ํ•œ ์ด๋ฆ„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L385 -L388

์ž, ์ด์ œ ์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋” ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ๋ก€๋Š” "impl ํŠน์„ฑ"์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ฆ‰, impl Trait ๋””์Šˆ๊ฐ€๋ง ์ž์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค). ์ƒˆ๋กœ์šด ์ดˆ๊ธฐ ๋ฐ”์ธ๋”ฉ ์ˆ˜๋ช…์„ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ GAT์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L482 -L501

๋ช‡ ๊ฐ€์ง€๋ฅผ ๊ฐ•์กฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € next_early_index ๋ฉ”์„œ๋“œ๋Š” ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋‹ค์Œ ์ดˆ๊ธฐ ๋ฐ”์ธ๋”ฉ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L488

๊ทธ๊ฒƒ์€ ์ถœ๋ฐœ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ Region::early ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์— ๋Œ€ํ•ด ํ•ด๊ฒฐ๋  ์ƒˆ๋กœ์šด ์กฐ๊ธฐ ๋ฐ”์ธ๋”ฉ ์ˆ˜๋ช… ์ •์˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L490 -L492

๋งˆ์ง€๋ง‰์œผ๋กœ with ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ ๋ฒ”์œ„๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L494 -L501

์ข‹์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‘ ๋ฒˆ์งธ ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์„ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ์ •์˜๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L509

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L520

๋‘˜ ๋‹ค ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ๋œ ์ œ๋„ค๋ฆญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์•„๋งˆ๋„ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ œ๋„ค๋ฆญ์ด ๋น„์–ด ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์˜ค๋Š˜ ์ผ์ฐ์ด ์ผ์— ๋›ฐ์–ด ๋“ค์—ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ์ง€๋„์— ์ˆ˜๋ช…์„ ์†Œ๊ฐœํ•œ ๋‹ค์Œ ํŠน์„ฑ/impl ํ•ญ๋ชฉ์„ ์‚ดํŽด๋ณด๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ(๋‚˜์ค‘์— ์ฐธ์กฐ)... ๊ฐ„๋‹จํ•œ(๋ฌด์ œํ•œ) ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • type parameters are not allowed on this type ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด librustc_typeck/astconv.rs qpath_to_ty ๋ฐ associated_path_def_to_ty ์— ๋Œ€ํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ธˆ์ง€๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ ๊ฒ€์œผ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ...
  • ์ง€๊ธˆ typeck์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (๊ตฌ์ฒด์ ์œผ๋กœ ์“ฐ๊ธฐ ์ €์žฅ)

typeck ์‹คํŒจ๋Š” ์—ฐ๊ด€๋œ ์œ ํ˜•์ด ์—†๋Š” ๊ฐ’์— ์ œ๋„ค๋ฆญ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— src/test/compile-fail/struct-path-associated-type.rs ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์žˆ๋‹ค๋ฉด ์ ์–ด๋„ ์—ฐ๊ฒฐ๋œ ์ผ๋ฐ˜ ์นด์šดํŠธ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ณ (์–ด๋””์—์„œ ์ˆ˜ํ–‰ํ• ์ง€ ์•Œ์•„๋‚ด๋ ค๊ณ  ์‹œ๋„ ์ค‘...) ๋…ธ๋“œ ๋“ฑ์— ๋Œ€ํ•œ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ž‘์—…ํ•  ์˜ˆ์ •์ด์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @brandonson๋‹˜! ๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Rust ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ•ดํ‚นํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•˜์ง€๋งŒ @sunjay ๋Š” ์ด๋ฏธ ๊ฐ™์€ ๊ฒƒ์„ ํ•ดํ‚นํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ๋ณ€๊ฒฝ์„ ์ถ”๊ตฌํ•ด ์™”์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์ด ๋๋‚ด๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค(์ด๋ฏธ ์‹œ์ž‘๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค). ์ด ๋…ธ๋ ฅ์„ ๋ณ‘๋ ฌํ™”ํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ฏธ๋ฆฌ ๋‹จ๊ณ„๋ฅผ ์•ฝ๊ฐ„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

๊ทธ๋Ÿฌ๋‚˜ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ด ์ด์ •ํ‘œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/46472 ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณง ์˜๊ฒฌ์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€์˜ ๋ฐœ์„ ๋ฐŸ์„ ์˜๋„๋Š” ์—†์ง€๋งŒ ๋” ๋งŽ์€ ์ง„์ „์ด ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์–ด๋–ค ๊ฒƒ๋„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ๋‹ค์Œ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์–ธ๊ธ‰์€ ๋‹ค์†Œ ์ตœ๊ทผ์ด์ง€๋งŒ). ์‚ฌ์‹ค, ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ GAT๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์œผ๋กœ ์ผ๋ถ€ NLL ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ํ•ญ๋ชฉ ๋ชฉ๋ก์—์„œ ์ด๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋†’์Šต๋‹ˆ๋‹ค. ์ˆœ๊ฐ„.

@sunjay , ์•„์ง ํ™œ๋ฐœํžˆ ์ž‘์—… ์ค‘์ด๊ฑฐ๋‚˜ ์ž‘์—…ํ•  ๊ณ„ํš์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ด ์ž‘์—…์„ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@brandonson ๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”. ๊ธฐ๊บผ์ด ๋„์™€์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :) ๋‚˜๋Š” ์‹ค์ œ๋กœ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ ๊ทน์ ์œผ๋กœ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Niko์™€ ๊ธด๋ฐ€ํžˆ ํ˜‘๋ ฅํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๋™์•ˆ ๊ตฌํ˜„์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์„ ์„ ๋‹คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์ด ๊ธฐ๋Šฅ ์ •๋ง ๊ฐ–๊ณ  ์‹ถ์–ด์š”!

์ง„ํ–‰ ์ƒํ™ฉ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? =) ์•ผ๊ฐ„ <3์—์„œ ์ด๊ฒƒ์„ ์‹คํ—˜ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

GAT์™€ const ์ œ๋„ค๋ฆญ์˜ ํšก๋‹จ๋ฉด์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ•จ๊ป˜ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ ์ œ์•ˆ์„œ์˜ ์ผ๋ถ€์˜€๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์˜ ์˜ˆ:

trait Foo {
    type Bar<const N>;
}

์•ˆ๋…•ํ•˜์„ธ์š” @sunjay ์ €๋Š” ์ด๊ฒƒ์ด ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 2018 ๋กœ๋“œ๋งต ๋Œ“๊ธ€์—์„œ ๋งŽ์ด ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ž‘์—…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํ˜„์žฌ ๊ฐ€์žฅ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋˜์–ด ๊ณง ๋ฐค๋‚ฎ์œผ๋กœ ์ง„ํ–‰๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๊ทธ๋ž˜์„œ ์ตœ๊ทผ์— ํ•™๊ต์™€ ๋‹ค๋ฅธ ์ผ๋กœ ์ง€๊ธˆ ๋ฐ”์œ @sunjay ๋ฅผ ๋งŒ๋‚˜ ์—ฌ๊ธฐ์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ณ„ํšํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค๊ณผ ๋‚˜๋Š” ์–ด๋Š ์‹œ์ ์—์„œ ๋งŒ๋‚˜ ์ „๋ฐ˜์ ์ธ ๊ตฌํ˜„ ์ „๋žต์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ๊ณ , ๊ทธ๋“ค์˜ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ปค๋ฐ‹์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์€ ์ธ๋ผ์ธ ์ฃผ์„์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค .

์•ž์œผ๋กœ ๊ฐ€์žฅ ์˜๋ฏธ ์žˆ๋Š” ์ „๋žต์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • ๋จผ์ € ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๋” ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์„œ์™€ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ "ํ”„๋ก ํŠธ์—”๋“œ" ๋ถ€๋ถ„์— ์•Œ๋ ค์ง„ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ ๋” ๋งŽ์€ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ํŠน์„ฑ ์‹œ์Šคํ…œ์„ ์ ์ ˆํ•˜๊ฒŒ ํ•ดํ‚นํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • ๊ธฐ์ดˆ์˜ ์ผ๋ถ€๋Š” ์ด๋ฏธ ๋งˆ๋ จ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ "๋ฆฌํŒฉํ† ๋ง" ์ž‘์—…์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

    • ํ•˜์ง€๋งŒ ์ž์„ธํžˆ ์ ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ณ„ํš์— ๋Œ€ํ•œ ์„œ๋ฉด ์„ค๋ช…์ด ์—†๊ณ  ์ง€๊ธˆ ๋‹น์žฅ ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ง€์นจ re: ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ์ฆ‰๊ฐ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ์ฃผ ํ›„๋ฐ˜์— ๋‚˜๋จธ์ง€ ๋””์ž์ธ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ฝ”๋“œ๋ฅผ ์žˆ๋Š” ์œ„์น˜์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ผ์ •์„ ์žก์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•„์š”ํ•œ ๊ณณ์œผ๋กœ.

ํ›Œ๋ฅญ ํ•˜๊ตฐ์š” !! @sunjay ์˜ ์ด๋ฒˆ ์ผ๊ณผ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋ ฅ์— ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์ „์ฒด ํ…Œ์ŠคํŠธ ๋ชจ์Œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

src/test/ui/rfc1598-generic-associated-types

๊ทธ๊ฒƒ๋“ค์„ ๋ณด๋ฉด ์ด๋ฏธ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • [ ] construct_with_other_type.rs -- ์˜ˆ๊ธฐ์น˜ ์•Š์€ E0110 ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • [x] empty_generics -- type Bar<,> ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • [x] generic-associated-types-where.rs -- ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์—์„œ where ์ ˆ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • [ ] generic_associated_type_undeclared_lifetimes.rs -- ์˜ˆ๊ธฐ์น˜ ์•Š์€ E0110 ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • [ ] iterable.rs -- ์˜ˆ๊ธฐ์น˜ ์•Š์€ E0110 ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • [ ] pointer_family.rs -- ์˜ˆ๊ธฐ์น˜ ์•Š์€ E0109 ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • [ ] streaming_iterator.rs -- ์˜ˆ๊ธฐ์น˜ ์•Š์€ E0110 ์˜ค๋ฅ˜ ๋ฐœ์ƒ

์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋ถ€์กฑํ•œ ๊ณณ

  • [ ] ํ˜„์žฌ "์˜ˆ์ƒ๋˜๋Š” ์‚ฌ์šฉ" ํ…Œ์ŠคํŠธ๊ฐ€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์„ฑ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • pointer_family ๋Š” ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

    • ๋‚˜๋Š” ์ผ์ข…์˜ trait Iterable { type Item; type Iter<'a>: Iterator<Item = &'a Self::Item>; } ํ…Œ์ŠคํŠธ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

  • [ ] ํ‰์ƒ ์„€๋„์ž‰ ํ…Œ์ŠคํŠธ -- ์ผ๋ฐ˜์ ์œผ๋กœ ํ‰์ƒ ์„€๋„์ž‰์„ ๊ธˆ์ง€ํ•˜๋ฏ€๋กœ ๋ถˆ๋ฒ•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • trait Foo<'a> { type Item<'a>; }

    • impl<'a> Foo<'a> for &'a u32 { type Item<'a> = i32; }

  • [ ] "์ •๊ทœํ™”๋œ" ๊ตฌ๋ฌธ์ด ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด pointer_family ํ…Œ์ŠคํŠธ์—๋Š” Self::Pointer<T> ๊ฐ€ ์žˆ์ง€๋งŒ <Self as PointerFamily>::Pointer<T> ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • [ ] GAT์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ˆ˜์˜ ์ธ์ˆ˜. ์˜ˆ: ์œ„์˜ Iterable ์ •์˜:

    • <T as Iterable>::Item -- ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๊นŒ? ๋‚˜์œ.

    • ์ผ๋ถ€ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์ˆ˜๋ช…์„ ์ƒ๋žตํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ์ด๊ฒƒ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

      ๋‚˜๋Š” ์—ฌ๊ธฐ ์–ด๋Š ์ชฝ์ด๋“  ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋ช…์‹œ์ ์œผ๋กœ '_ ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

    • <T as Iterable>::Item<'_> -- ๋งž์Šต๋‹ˆ๋‹ค!

    • <T as Iterable>::Item<T> -- ์œ ํ˜•์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค!

    • ๋“ฑ, ๋ฌผ๋ก  ์œ ํ˜•๊ณผ ์ˆ˜๋ช…์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • [ ] ๊ด€๋ จ ์œ ํ˜•์˜ ๊ธฐ๋ณธ๊ฐ’? trait Foo { type Bar<T, U = T> where T: PartialEq<U>; }

    • ์ด ๊ฒฝ์šฐ SomeType::Bar<u32> ๋Š” SomeType::Bar<u32,u32> ์— ๋Œ€ํ•ด ์งง์€ ๊ฒƒ์ด๋ฏ€๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๊ธฐ์น˜ ์•Š์€ E0110 ์˜ค๋ฅ˜ ์ˆ˜์ •

prohibit_type_params ์—์„œ ์˜ค๋ฅ˜ E0110์ด ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L912

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ํ˜ธ์ถœ๋œ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋กœ์ปฌ ๋นŒ๋“œ๋ฅผ ์–ป๊ณ  RUST_BACKTRACE=1 -Ztreat-err-as-bug ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rustc๊ฐ€ ์•„์ง ๊ตฌ์ถ• ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. :P ๊ทธ๋ž˜์„œ ๋Œ€์‹  rg prohibit_type_params ์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ณธ ์ˆ˜์ƒํ•œ ์‚ฌ๋ก€ ํ•˜๋‚˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ง€์ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ˜ธ์ถœ์€ associated_path_def_to_ty ์ž…๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L791 -L803

์ฃผ์„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Self::Pointer<T> ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์—์„œ Pointer<T> ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ฒจ๋ถ€๋œ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ). GAT ์ด์ „๊นŒ์ง€๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ(์˜ˆ: T::Item ) ํฌ๊ด„์ ์ธ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L810

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ–‰์„ ์ œ๊ฑฐํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ œ๊ณต๋˜๋ฉด ์˜ˆ์ƒ ์ˆซ์ž์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ผ์ข…์˜ ๊ฒ€์‚ฌ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด create_substs_for_ast_path ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋Š” ๊ณ„์ •์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๊ณต์œ  ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์•„์ง ์ž‘์—… ์ค‘์ธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒŒ ๊ฐˆ ๊ธธ์ด ๋จผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. GAT๋Š” ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์›ํ•˜๋Š” RFC์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ...

@rickyhan ๊ทธ๋ž˜์„œ @Centril ๊ณผ @gavento ๋Š” ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด WG ํŠน์„ฑ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ง„์ „์ด ์žˆ์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋“ค์ด ์ฐจ์ž„๋ฒจ์„ ์šธ๋ฆด ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์— PR์€ ํ™˜์˜๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. =)

๋‚ด๊ฐ€ ๋ฐ”๋ณด๋ผ๋ฉด ๋ฏธ์•ˆํ•˜์ง€๋งŒ GAT์—์„œ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒƒ์ด ํ•ฉ๋ฒ•์ž…๋‹ˆ๊นŒ?

trait Sequencer {
    type Wrap<A>;
    fn chain<A, B, F>(Self::Wrap<A>, F) -> Self::Wrap<B>
        where F: FnOnce(A) -> Self::Wrap<B>;
    fn wrap<A>(A) -> Self::Wrap<A>;
}

์ด ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ ๋ถ„ํ•„์ด ์ตœ๊ทผ์— ๊ฐ€ํŠธ ์ง€์ง€๋ฅผ ์–ป์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณง ๋…น์ด ์Šฌ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

@mark-im ์ง€๋‚œ์ฃผ์— ํ•œ๋ฒˆ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋‚ด ์ดํ•ด์— ๋”ฐ๋ฅด๋ฉด ๊ตฌ๋ฌธ ํŒŒ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์ง€๋งŒ). ๊ทธ๋Ÿฌ๋‚˜ "๊ตฌํ˜„"์€ ์•„์ง ์ž‘์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ https://github.com/rust-lang/rust/issues/44265#issuecomment-330915766 ์ฐธ์กฐ)

@quadrupleslap AIUI, ๋‚˜์ค‘์— ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ ์ฒ˜์Œ์—๋Š” GAT๊ฐ€ ํ‰์ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค..

@Boscop RFC๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ง€์›ํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ Rustc์—์„œ ๊ตฌ๋ฌธ ๊ตฌํ˜„์˜ ์ •ํ™•ํ•œ ์ƒํƒœ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋Œ€๋ถ€๋ถ„ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ˆœ์œ„๊ฐ€ ๋†’์„์ˆ˜๋ก ICE๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
http://play.rust-lang.org/?gist=a48959858ed5dd432c2396feae5c3cc1&version=nightly&mode=debug

๋‚˜๋Š” ๋ถ„ํ•„ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ ์ „์ฒด ๊ตฌ๋ฌธ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ๊ตฌ๋ฌธ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ œ๊ฐ€ ์ง์ ‘ ๊ณ ์น  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋‚ด๊ฐ€ ๋ณด๊ธฐ์—๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด GAT ๊ตฌํ˜„ ์†๋„๋ฅผ ๋Šฆ์ถ”๋Š” ์ฃผ์š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ตœ์†Œํ•œ ๋ช‡ ๋ช… ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ •ํ™•ํ•œ ๊ตฌํ˜„ ์ƒํƒœ์™€ ์ด๋ฏธ ์ž‘์—… ์ค‘์ธ ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค. GAT ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด Discord(๋˜๋Š” IRC?) ์ฑ„๋„์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ™•์‹คํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ ์ฃผ์— ๋ช‡ ์ผ ๋™์•ˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Discord์— ์ „์šฉ ์ฑ„๋„์„ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฑ„๋„์„ ์–ป๋Š” ๋Œ€์‹  ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ GAT์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์š”์•ฝํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋ฏ€๋กœ ์ด๊ฒƒ์„ ์†Œ๊ธˆ ํ•œ ์•Œ๊ณผ ํ•จ๊ป˜ ๊ฐ€์ ธ ๊ฐ€๋ผ! ๋˜ํ•œ: ์ผ๋ถ€ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GAT์— ๊ด€ํ•œ ์‹œํ–‰ ๋…ธ๋ ฅ ์š”์•ฝ

๊ทธ ์ดํ›„๋กœ UI ํ…Œ์ŠคํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค . ๊ทธ๋ฆฌ๊ณ  GAT์™€ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ PR์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ (c)(ํŠน์„ฑ ์‹œ์Šคํ…œ)์€ "๋น„๋ฐ€๋กœ" ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ, ๊ณ„ํš์€ ๊ณง ์ƒˆ๋กœ์šด ๋ถ„ํ•„ ๊ธฐ๋ฐ˜ ํŠน์„ฑ ์†”๋ฒ„๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ  GAT๊ฐ€ ์ด์ „ ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํŠน์„ฑ ์†”๋ฒ„์˜ ํ†ตํ•ฉ์€ "Chalkification" ์ถ”์  ๋ฌธ์ œ ๋กœ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค. ๋ถ„ํ•„ ๋ฐ ๋ฐฑ์•…ํ™”์™€ ๊ด€๋ จ๋œ ๊ฝค ๋งŽ์€ PR์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ "GAT ๊ตฌํ˜„ ์™„๋ฃŒ" (2018-05-24 ๋ณ‘ํ•ฉ)๋ผ๋Š” ์ดˆํฌ PR์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ GAT์˜ ํ•ต์‹ฌ ์‹œ์Šคํ…œ์€ ์ด๋ฏธ ์ œ์ž๋ฆฌ์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋ถ„ํ•„๋กœ ํ‘œ์‹œ๋œ "GAT"๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ตฌํ˜„์ด๋ฉฐ rustc์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ง€ use chalk; ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. @scalexm ์ด ๋‚˜์—๊ฒŒ ๋งํ–ˆ๋“ฏ์ด: "ํ•  ์ผ์ด ๊ฝค ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค."


๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป๊ณ  ๋„์›€์„ ๋ฐ›์œผ๋ ค๋ฉด #wg-traits Discord ์ฑ„๋„๊ณผ WG ์ถ”์  ๋ฌธ์ œ ํŠน์„ฑ ์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ @nikomatsakis ๋Š” rust-lang discord ์„œ๋ฒ„์— #wg-traits-gat ์ฑ„๋„์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค( ์—ฌ๊ธฐ์— ๊ฐ€์ž…ํ•˜์„ธ์š” ). ์šฐ๋ฆฌ๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋„์›€์„ ์›ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๊ธฐ๋Šฅ์˜ ์ƒํƒœ(ํŠนํžˆ ์•„์ง ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…๊ณผ ๋„์›€์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„)์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š” ์†Œ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ์ €์™€ ๊ฐ™์ด ์•„์ง ๊นŠ์ด ๊ด€์—ฌํ•˜์ง€ ์•Š์€/WG ํŠน์„ฑ์˜ ์ผ๋ถ€์ธ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋” ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์˜์‚ฌ ์†Œํ†ต์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. :)

์ตœ๊ทผ์— ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? Chalk๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์— ํ†ตํ•ฉ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (์•„๋งˆ๋„ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์•„๋งˆ๋„ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

48049

์ฐธ๊ณ ๋กœ(์•Œ๋ ค์ ธ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Œ) ์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํŒจ๋‹‰ ์ƒํƒœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

use typenum::{U1,U2,U3,Unsigned};

trait Array {
    type Of<Elem> ;
}

impl Array for U1 { type Of<T> = [T;1]; }
impl Array for U2 { type Of<T> = [T;2]; }
impl Array for U3 { type Of<T> = [T;3]; }

@varkor ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋˜ ๋‹ค๋ฅธ ๋ฉ”๋ชจ(๋‹ค์‹œ, ์•„๋งˆ๋„ ์•Œ๋ ค์ง„). GAT๊ฐ€ ์žˆ์œผ๋ฉด & ๋ฐ &mut ์œ ํ˜•์— ๋Œ€ํ•ด ๋ฉ‹์ง€๊ฒŒ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ my_func ๋ฐ my_func_mut ํ•จ์ˆ˜ ๊ฐ„์— ์ฝ”๋“œ๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#![feature(arbitrary_self_types)]
#![feature(generic_associated_types)]

use std::marker::PhantomData;

struct Pure <'t> (PhantomData<&'t()>);
struct Mut  <'t> (PhantomData<&'t()>);

type Ref<M, T> = <M as Acc>::Pat<T>;

trait Acc { type Pat<T: ?Sized>; }
impl<'t> Acc for Pure <'t> { type Pat<T> = PureRef <'t, T>; }
impl<'t> Acc for Mut  <'t> { type Pat<T> = MutRef  <'t, T>; }

struct PureRef <'t, T: ?Sized> (&'t     T);
struct MutRef  <'t, T: ?Sized> (&'t mut T);


/// USAGE ///

struct Buf<T> {
    data: Vec<T>
}

impl<T> Buf<T> {
    fn as_mut<M: Acc>(s: Ref<M, Self>) -> Ref<M, [f32]>
    {
        unimplemented!()
    }
}

๊ฑฐ์˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. GAT ์—†์ด ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์œ ํ˜•์€ ํญ๋ฐœ์ ์ž…๋‹ˆ๋‹ค.

#![feature(arbitrary_self_types)]

use std::marker::PhantomData;
use std::ops::Deref;

struct Pure <'t> (PhantomData<&'t()>);
struct Mut  <'t> (PhantomData<&'t()>);

type Ref<M, T> = <M as Acc<T>>::Pat;

trait Acc<T: ?Sized> { type Pat; }
impl<'t, T: 't + ?Sized> Acc<T> for Pure <'t> { type Pat = PureRef <'t, T>; }
impl<'t, T: 't + ?Sized> Acc<T> for Mut  <'t> { type Pat = MutRef  <'t, T>; }

struct PureRef <'t, T: ?Sized> (&'t     T);
struct MutRef  <'t, T: ?Sized> (&'t mut T);


/// USAGE ///

struct Buf<T> {
    data: Vec<T>
}

impl<T> Buf<T> {
    fn as_mut<M>(self: Ref<M, Self>) -> Ref<M, [f32]>
    where M: Acc<Self> + Acc<[f32]>,
          Ref<M, Self>: Deref<Target = Self>
    {
        unimplemented!()
    }
}

(์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋จ)

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ง€์› ์งˆ๋ฌธ์— ๊ฐ€๊น์ง€๋งŒ RFC ๋˜๋Š” ์—ฌ๊ธฐ์˜ ์˜๊ฒฌ์—์„œ ์™„์ „ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŽ˜์ด์ง€์— ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด ์ œ์•ˆ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

1.41 nightly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

pub trait MyTrait {
    type MyType<U>;

    fn f<U>(self, x : <Self as MyTrait>::MyType<U>);
}

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ "์œ ํ˜• ์ธ์ˆ˜๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ" MyType ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜์‹ฌ์Šค๋Ÿฌ์›Œ ๋ณด์ด๋Š” <U> ๋ฅผ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

pub trait MyTrait {
    type MyType<U>;

    fn f<U>(self, x : <Self as MyTrait>::MyType);
}

๋†€๋ž๊ฒŒ๋„ ์ปดํŒŒ์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ impl์„ ์ž‘์„ฑํ•  ๋•Œ :

impl MyTrait for u64 {
    type MyType<U> = U;

    fn f<U>(self, x : <Self as MyTrait>::MyType) -> <Self as MyTrait>::MyType {
        x;
    }
}

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํŒจ๋‹‰ ์ƒํƒœ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ณ„ํš์ด ์ง€๊ธˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
  2. ์ง€๊ธˆ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ด ์ œ์•ˆ์— ๋”ฐ๋ผ ๊ฐ€๋Šฅํ• ๊นŒ์š”?
  3. ๊ทธ๋ ‡๋‹ค๋ฉด ์•ผ๊ฐ„์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ํƒ€์ž„๋ผ์ธ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์‹œ๊ฐ„์„ ๋‚ด์–ด ๋‹ต๋ณ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@clintonmead ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฒฐ๊ตญ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„์€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์‚ฌ์‹ค, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค!). ํƒ€์ž„๋ผ์ธ์ด ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋„ค์š”.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ํ†ตํ•ฉ์ด ์ถฉ๋ถ„ํžˆ ์ง„ํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Chalk ์ง์›์—๊ฒŒ ํ™•์ธํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ด์ œ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • #30472
  • #67509
  • #67510
  • #67512
  • #67513

ํ˜„์žฌ ์ฐจ๋‹จ๊ธฐ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ฌธ์ œ ์„ค๋ช…์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@DutchGhost ๊ฐ€ ์ œ๊ธฐํ•œ ๋” ๋งŽ์€ ์ฐจ๋‹จ ๋ฌธ์ œ ์ถ”๊ฐ€

์ด๊ฒƒ์€ ๋” ๋†’์€ ์ข…๋ฅ˜์˜ ์œ ํ˜•์„ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์ฃผ์š” ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// the plug/unplug idea is from https://gist.github.com/edmundsmith/855fcf0cb35dd467c29a9350481f0ecf

trait Monad /* : Applicative (for pure/return, doesn't matter for this example) */ {
    // Self is like the "f a" in haskell

    /// extract the "a" from "f a"
    type Unplug;

    /// exchange the "a" in "f a" in the type of Self with B
    type Plug<B>: Monad;

    fn bind<B, F>(this: Self, f: F) -> Self::Plug<B>
    where
        F: Fn(Self::Unplug) -> Self::Plug<B>;
}

impl<A> Monad for Option<A> {
    type Unplug = A;
    type Plug<B> = Option<B>;
    fn bind<B, F>(this: Self, f: F) -> Option<B>
    where
        F: Fn(A) -> Option<B> {
        this.and_then(f)
    }
}

์ œ์•ˆ๋œ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์งˆ๋ฌธ:

์ด๋ ‡๊ฒŒ ์ƒ๊ธด ํŠน์ง•์ด ์žˆ์–ด์š”

trait TradeableResource{
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌํ˜„์ž

struct Food(f64);
impl TradeableResource for Food{}

๋‚ด ํŠน์„ฑ์˜ ๋ชจ๋“  ๊ตฌํ˜„์ž๋ฅผ "newtype"(f64๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋‹จ์ผ ์š”์†Œ ํŠœํ”Œ ๊ตฌ์กฐ์ฒด)๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ๊ตฌํ˜„์ด ์—ฌ๊ธฐ์—์„œ ๊ณ ๋ ค๋œ๋‹ค๋ฉด ๊ฐ€๋Šฅํ• ๊นŒ์š”?

๋‹ค์Œ์€ ์•ฝ๊ฐ„ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ด์ง€๋งŒ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

trait TradeableResource{
    type Wrapper<T>:T(f64)
}

@ChechyLevas ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์ด๊ฒƒ์€ GADT์˜ ๋ฒ”์œ„์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ดํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ GADT๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ˆ˜์ง‘ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์—์„œ, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์ด ์ƒˆ๋กœ์šด ์œ ํ˜•์ด๋ผ๋Š” ๋ณด์žฅ์„ ๊ธฐ๊บผ์ด ํฌ๊ธฐํ•˜๊ณ  ๋Œ€์‹  ๋‚ด๋ถ€ ๊ฐ’์„ ๊ฐ๊ฐ ๊ฐ์‹ธ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๋ฉด . ํŽธ๋ฆฌํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ถฉ๋ถ„ํžˆ ์ž˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

trait Traceable resource: From<f64> + Into<f64> { }

(์ด๊ฒƒ์€ ๋งคํฌ๋กœ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์–‘๋ฐฉํ–ฅ์œผ๋กœ From ๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

์ด ์ƒํ™ฉ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ๋Š๋‚Œ์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋น„๋™๊ธฐ ํŠน์„ฑ๊ณผ ์ˆ˜๋ช…์„ ์•ฝ๊ฐ„ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ํ•œ ๊ฐ€์ง€๋Š” ReadAt: Future trait ReadAt<'r> ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋งŽ์€ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์€ ์ˆ˜๋ช…์„ R ์— ์ฒจ๋ถ€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

impl<'a, 'r, R> ReadAt<'r> for &'a dyn for<'z> ReadAt<'z, ReadAt = R> + 'a {
    type ReadAt = R; // cannot have an `impl<R<'lifetime>>`
    ...
}

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์ด GAT๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ํŠน์„ฑ ๊ฐ์ฒด๊ฐ€ ๊ด€๋ จ ์œ ํ˜•์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ ๋งˆ๋ฒ•์ด ๋‹ค์‹œ ํ•„์š”ํ•œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค.

์ฒ˜๋Ÿผ:

trait ReadAt {
    type ReadAt<'r>: Future<Output = io::Result<usize>>;

    fn read_at<'a>(&'a self, buf: &'a mut [u8], at: u64) -> Self::ReadAt<'a>;
}

impl<'d> ReadAt for &'d (dyn ReadAt<HERE> + 'd) {
}

HERE ์— ์ˆ˜๋ช…์„ ํฌํ•จํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€๋งŒ R ๊ฐ€ ๋„ˆ๋ฌด ๊ตฌ์ฒด์ ์ด๋ฏ€๋กœ IMO๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

impl<'d, R> ReadAt for &'d (dyn ReadAt<ReadAt = R> + 'd) {
    type ReadAt<'r> = R;

    fn read_at<'a>(&'a self, buf: &'a mut [u8], at: u64) -> Self::ReadAt<'a> {
        (**self).read_at(buf, at)
    }
}

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์Šค๋‹ˆํŽซ์— ์ˆ˜๋ช…์„ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ฌ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ํŠน์„ฑ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

struct Test<T: ReadAt>(T);

impl<T: ReadAt> Test<T> {
    fn into_trait_object<'a>(&'a self) -> Test<&'a dyn ReadAt<ReadAt = T::ReadAt>> {
        todo!();
    }
}

T::ReadAt ๋Š” ๋‚ด๊ฐ€ ์ œ๊ณตํ•  ์ˆ˜ ์—†๋Š” ์ˆ˜๋ช…์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ dyn ReadAt<ReadAt<'r> = T::ReadAt<'r>> ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ํ™•์žฅ์„ ๋†“์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋˜๋Š” ์ผ์น˜ํ•˜๋Š” ์ˆ˜๋ช… ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ IMO ์œ„์˜ ์Šค๋‹ˆํŽซ์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ;-) )

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜๋ช… ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋ช… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ vtable๊ณผ ์œ ํ˜• ํฌ๊ธฐ์— ์–ด๋–ป๊ฒŒ๋“  ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†๋‹ค๋ฉด ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@jendrikw ์ฝ”๋“œ๋Š” ์ตœ์‹  nightly(1.46)๋กœ ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• ๋“ฑ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ๋” ๋งŽ์€ ๊ฒƒ์„ ํ™•์ธํ•  fp ์ง€์‹์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜, ๋‚˜๋Š” ์•„๋งˆ๋„ ํ‰์ƒ์ด ์ถฉ๋ถ„ํžˆ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ์ผ์— GAT๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค(์ž‘์—… ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™„์ „ํ•œ ์ฝ”๋“œ ํŒŒ์ผ ):

/// Helper trait for "stripping indention" from an object reference
pub trait AsUnindented<'ast> {
    type Output;

    /// Returns a reference to the unindented part of `Self`
    fn as_unindented(&'ast self) -> Self::Output;
}

impl<'ast, T: 'ast> AsUnindented<'ast> for Indented<T> {
    type Output = &'ast T;

    #[inline]
    fn as_unindented(&'ast self) -> &'ast T {
        &self.data
    }
}

impl<'ast, T: 'ast> AsUnindented<'ast> for crate::Block<T>
where
    T: AsUnindented<'ast> + 'ast,
{
    type Output = crate::View<'ast, T, fn(&'ast T) -> T::Output>;

    #[inline]
    fn as_unindented(&'ast self) -> Self::Output {
        crate::View::new(self, T::as_unindented)
    }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ์ฝ”๋“œ์—์„œ GAT๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

pub trait AsUnindented {
    type Output<'ast>;

    /// Returns a reference to the unindented part of `Self`
    fn as_unindented<'ast>(&'ast self) -> Self::Output<'ast>;
}

impl<T> AsUnindented for Indented<T> {
    type Output<'ast> = &'ast T;

    #[inline]
    fn as_unindented<'ast>(&'ast self) -> &'ast T {
        &self.data
    }
}

impl<T> AsUnindented for crate::Block<T>
where
    T: AsUnindented,
{
    type Output<'ast> = crate::View<'ast, T, fn(&'ast T) -> T::Output<'ast>>;

    #[inline]
    fn as_unindented<'ast>(&'ast self) -> Self::Output<'ast> {
        crate::View::new(self, T::as_unindented)
    }
}

์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ํŠน์„ฑ ๊ตฌํ˜„ ๋ชจ๋‘ E0309 ( the parameter type 'T' may not live long enough )๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์ œ๊ฐ€ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” impl ์ˆ˜์ค€์—์„œ T ์— ๊ฒฝ๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ํ•ด๋‹น ์ˆ˜์ค€์—์„œ๋Š” 'ast ์ˆ˜๋ช…์ด ์—†์œผ๋ฉฐ $#๋ฅผ ์ œํ•œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค T: 'static (๊ทธ๋ฆฌ๊ณ  for<'ast> T: 'ast ์™€ ๊ฐ™์€ ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ).

ํŽธ์ง‘ : ๋‚ด ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— GAT๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ํ•˜๋‚˜๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ๋กœ์„œ๋Š”). ํ•˜์ง€๋งŒ ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ๊ฐ„๋‹จํžˆ ๊ณ ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ˆ˜๋ช… ์ œํ•œ์€ ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํŠน์„ฑ ๋ฒ„์ „์—์„œ Self: 'ast ์‚ฌ์šฉ). ์ด ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/rust-lang/rust/blob/db4826dd6ca48663a0b4c5ab0681258999017c7d/src/test/ui/generic-associated-types/iterable.rs#L6 -L21

๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ๋ถ€๋ถ„์ ์œผ๋กœ ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ...


์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:33:5
   |
33 |     type Output<'ast> where T: 'ast = &'ast T;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:45:5
   |
45 |     type Output<'ast> where T: 'ast = crate::View<'ast, T, fn(&'ast T) -> T::Output<'ast>>;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:59:5
   |
59 | /     type Output<'ast2>
60 | |         where
61 | |             T: 'ast2,
62 | |             O: 'ast2
63 | |         = crate::View<'ast2, T, crate::view::MapViewFn<F, fn(F::Output<'ast2>) -> O::Output<'ast2>>>;
   | |_____________________________________________________________________________________________________^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast2`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `O` may not live long enough
  --> src/indention.rs:59:5
   |
59 | /     type Output<'ast2>
60 | |         where
61 | |             T: 'ast2,
62 | |             O: 'ast2
63 | |         = crate::View<'ast2, T, crate::view::MapViewFn<F, fn(F::Output<'ast2>) -> O::Output<'ast2>>>;
   | |_____________________________________________________________________________________________________^
   |
   = help: consider adding an explicit lifetime bound `O: 'ast2`...
   = note: ...so that the type `O` will meet its required lifetime bounds

์ฝ”๋“œ๊ฐ€ ํ•œ ๋‹จ๊ณ„๋ฅผ ํ†ต๊ณผํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(์ด์ „์—๋Š” ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ๊ทธ ์‚ฌ์ด์— E0107 ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋˜ ๋‹ค๋ฅธ ๋ฒ”์ฃผ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚จ) hm.

ํŽธ์ง‘ : ์ฒซ ๋ฒˆ์งธ ๋ฌธ์žฅ( where Self: 'ast )์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ทธ ๋ถ€๋ถ„์ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณ„์†ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•œ๋‹ค.


์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ

์ข‹์•„, ๋‹ค์Œ ์Šค๋‹ˆํŽซ:

impl<'ast, T, F, O> AsUnindented for crate::View<'ast, T, F>
where
    Self: Clone,
    F: crate::view::ViewFn<T, Output = &'ast O>,
    O: AsUnindented + 'ast,
{
    type Output<'ast2>
        where
            T: 'ast2,
        = crate::View<'ast, T, crate::view::MapViewFn<F, fn(&'ast O) -> O::Output<'ast>>>;

    #[inline]
    fn as_unindented<'ast2>(&'ast2 self) -> Self::Output<'ast2> {
        self.clone().map::<for<'x> fn(&'x O) -> O::Output<'x>, _>(O::as_unindented)
    }
}

์˜ค๋ฅ˜:

error[E0631]: type mismatch in function arguments
  --> src/indention.rs:66:67
   |
66 |         self.clone().map::<for<'x> fn(&'x O) -> O::Output<'x>, _>(O::as_unindented)
   |                                                                   ^^^^^^^^^^^^^^^^
   |                                                                   |
   |                                                                   expected signature of `for<'x> fn(<F as view::ViewFn<T>>::Output<'x>) -> _`
   |                                                                   found signature of `for<'x> fn(&'x O) -> _`

<F as view::ViewFn<T>>::Output<'x> ==> &'ast O ์™€ &'x O ๊ฐ€ ๊ฐ™์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐ”์ธ๋”ฉ๋œ F: for<'x> crate::view::ViewFn<T, Output = &'x O> ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
๋‹ค๋ฅธ ์‹œ๋„ ์˜ค๋ฅ˜:

error[E0582]: binding for associated type `Output` references lifetime `'x`, which does not appear in the trait input types
  --> src/indention.rs:56:39
   |
56 |     F: for<'x> crate::view::ViewFn<T, Output = &'x O>,
   |                                       ^^^^^^^^^^^^^^

๋‚˜๋Š” ํŠน์„ฑ ์ถœ๋ ฅ ์œ ํ˜• ํ• ๋‹น์—์„œ forall<'x> ๊ฒฝ๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

where
    F: crate::view::ViewFn<T, for<'x> Output<'x> = &'x O>,

๊ตฌ๋ฌธ ๋ถ„์„์กฐ์ฐจ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(" + , , , :: ๋˜๋Š” > , = ๋ฐœ๊ฒฌ๋จ ").

67510์€ ํ•ด๋‹น ๊ฒฝ๊ณ„๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Œ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—๋Š” ์ง€์—ฐ ์ •๊ทœํ™”๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(#60471).

self.clone().map ์˜ ํŠน์„ฑ ์ถœ๋ ฅ ์œ ํ˜•์ด ์‹ค์ œ๋กœ O::as_unindented ์˜ ์œ ํ˜•์ž…๋‹ˆ๊นŒ, ์ฆ‰ ๋งต์˜ ์ธ์ˆ˜ ์œ ํ˜•
crate::View ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด์ง€๋งŒ map ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ์ธ์ˆ˜๋ฅผ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜•์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@sighoya ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— crate::view::ViewFn::map ์˜ impl์— ๋Œ€ํ•œ ์ง์ ‘ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด์— ๋Œ€ํ•ด ๋ฌด์—‡์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๊นŒ?:

where
    for<'x> F: crate::view::ViewFn<T, Output<'x> = &'x O>,

(์•„์ง) ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@matthewjasper ,

Rust Nomicon ์—์„œ ๋‹ค์Œ์ด ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค.

where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8,

Output<'x> = &'x 0> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ, Output<'x>=... ๋Š” ํ•ด๋‹น ์œ„์น˜์—์„œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Rustc 1.46.0-nightly ๋กœ ๋” ์ด์ƒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š” create, grdf ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ GAT์™€ ๊ด€๋ จํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ๊ฒฝ์šฐ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์—ฐ๊ด€๋œ ๋ฐ˜๋ณต์ž ์œ ํ˜•๊ณผ ํ•จ๊ป˜ Graph ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ˜๋ณต์ž๋ฅผ ๋‹ค๋ฅธ ํŠน์„ฑ Iter ์— ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

pub trait Iter<'a, T: 'a> {
    type Triples: Iterator<Item = Triple<&'a T>>;
    type Subjects: Iterator<Item = (&'a T, Self::Predicates)>;
    type Predicates: Iterator<Item = (&'a T, Self::Objects)>;
    type Objects: Iterator<Item = &'a T>;
}

pub trait Graph<T = crate::Term> {
    /// Iterators.
    type Iter<'a>: Iter<'a, T>;

    ...
}

์ง€๊ธˆ๊นŒ์ง€ ์ž˜ ์ž‘๋™ํ–ˆ๋˜ Graph ๊ตฌํ˜„์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl<'a, T: 'a + Hash + Eq> crate::Iter<'a, T> for Iterators {
    type Objects = Objects<'a, T>;
    type Predicates = Predicates<'a, T>;
    type Subjects = Subjects<'a, T>;
    type Triples = Iter<'a, T>;
}

impl<T: Hash + Eq> crate::Graph<T> for HashGraph<T> {
    type Iter<'a> = Iterators;

    ...
}

์ด์ œ Rustc๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

error[E0309]: the parameter type `T` may not live long enough
  --> src/hash_dataset.rs:50:2
   |
50 |     type Iter<'a> = Iterators;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'a`...
   = note: ...so that the type `T` will meet its required lifetime bounds

T ๊ฐ€ ์ด๋ฏธ Iter 'a ์— ๋ฌถ์—ฌ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ณ„๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ...

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. where ๊ฒฝ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์‹œ ์ž‘๋™ํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŠน์„ฑ์—์„œ:

type Iter<'a>: Iter<'a, T> where T: 'a;

๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„์—์„œ:

type Iter<'a> where T: 'a = Iterators;

๊ทธ๋Ÿฌ๋‚˜ ํŠนํžˆ ๊ตฌํ˜„์—์„œ where ๊ฒฝ๊ณ„์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค(์ฒ˜์Œ ๋ณธ ๊ฒฝ์šฐ). ๋˜ํ•œ ์ด์ „์— ์ž‘๋™ํ•œ ์ด์œ ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋‚˜๋Š” ์‹ฌ์ง€์–ด ๋‚ด ๊ณ ์•ฝํ•œ ํ•ดํ‚น์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ด€๋ จ ๋ฐ˜๋ณต์ž๋ฅผ ํŠน์„ฑ ์ž์ฒด์— ๋„ฃ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@DutchGhost๊ฐ€ ์ œ๊ธฐํ•œ ๋” ๋งŽ์€ ์ฐจ๋‹จ ๋ฌธ์ œ ์ถ”๊ฐ€

https://github.com/rust-lang/rust/issues/74684๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋‚˜๋Š” ๊ธ€์„ ์“ฐ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋‘˜๋Ÿฌ ์ฃผ์„ธ์š” . ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์€ ์ด๋ฏธ ๊ฑฐ์˜ 3๋…„ ๋™์•ˆ ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฉฐ ๊ฐ€์žฅ ์›ํ•˜๋Š” ์ƒˆ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊น๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ€์žฅ ์ตœ๊ทผ ์ƒํƒœ ์š”์•ฝ์€ 2018๋…„ 6์›” @LukasKalbertodt ๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋ฐฑ์•…ํ™”" ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ˆœ์ง„ํ•œ ๊ด€์ฐฐ: ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  GAT ์šฉ๋„์—๋Š” ์ˆ˜๋ช… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ถ•์†Œ๋œ ํ‰์ƒ ์ „์šฉ ๋ฒ„์ „์˜ GAT๊ฐ€ ์ œ๊ณตํ•˜๊ธฐ ๋” ๊ฐ„๋‹จํ• ๊นŒ์š”?

https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656์€ (๋‹ค์†Œ ๊ฐ„๊ฒฐํ•œ) ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค.

67510์€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์ฃผ์š” ICE/๋ˆ„๋ฝ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ด RFC๊ฐ€ Monad ๋ฐ Functor ๋ฅผ ์ง์ ‘ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด HKT์—์„œ ํ•ด์•ผ ํ•  ์ผ์ด ๋” ์žˆ์Šต๋‹ˆ๊นŒ?

์ด RFC๊ฐ€ Monad์™€ Functor๋ฅผ ์ง์ ‘ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊นŒ์š”? ์•„๋‹ˆ๋ฉด HKT์—์„œ ํ•ด์•ผ ํ•  ์ผ์ด ๋” ์žˆ์Šต๋‹ˆ๊นŒ?

@ibraheemdev RFC ์ƒํƒœ

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋†’์€ ์ข…๋ฅ˜์˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์›ํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Monad์™€ ๊ฐ™์€ ํŠน์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ•œ ๋ฒˆ์— ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ณ ๊ธ‰ ๋‹คํ˜•์„ฑ๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ตฌํ˜„์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋ถ€๋ถ„ ์ ์šฉ๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ณ ๊ธ‰์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ผ๋ถ€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ ๊ธธ์„ ๋‹ฆ์Šต๋‹ˆ๋‹ค.

@ibraheemdev : ์ œ ๋Š๋‚Œ์€ ๋ชจ๋‚˜๋“œ์™€ ํŽ‘ํ„ฐ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ๊ด€์šฉ์ ์ธ ๋ฐฉ๋ฒ•์€ ์ œ๋„ค๋ฆญ ๊ด€๋ จ ํŠน์„ฑ ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ œ๋„ค๋ฆญ ๊ด€๋ จ ์œ ํ˜•์€ ํ™•์‹คํžˆ ์ „์ œ ์กฐ๊ฑด์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

GAT๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ Monad ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@ibraheemdev ๊ฐ€์ •์  ์œผ๋กœ ์˜ˆ, HKT๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ๋งจ ์œ„์— Monad ํŠธ๋ ˆ์ž‡์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ๋Š” ์ž‘์—…์ด ์ง„ํ–‰๋˜์ง€ ์•Š์œผ๋ฉฐ ์•„๋งˆ๋„ ์•ž์œผ๋กœ๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์€ Rust๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์‹ค์ œ๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. https://twitter.com/withoutboats/status/1027702531361857536

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ GAT๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

trait MonadFamily {
    type Monad<T>;
    fn pure<T>(inner: T) -> Self::Monad<T>;
    fn bind<T, U, F: FnOnce(T) -> U>(this: Self::Monad<T>, f: F) -> Self::Monad<U>;
}

@ibraheemdev

GAT๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ Monad ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, Rust์—์„œ ๊ณ ๊ธ‰ ์œ ํ˜•์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ง€๊ธˆ์€ ์•ˆ์ •์ ์ธ ์ƒํƒœ์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰