ããã¯ããžã§ããªãã¯é¢é£ã¿ã€ãã®è¿œè·¡ã®åé¡ã§ãïŒrust-lang / rfcsïŒ1598ïŒ
TODOïŒ
ãããç§ãåžžã«ææ°ã®ç¶æ ã«ä¿ã€ããã«åªåããäžçš®ã®å®æœèšç»ã§ãã
ãŸããASTã«ã€ããŠè©³ãã説æããŸãã ãŸããä»æ¥ãããã©ã®ããã«æ©èœãããã«ã€ããŠèª¬æããŸãããïŒ
ãã¬ã€ãå®çŸ©ã®type Foo: Bar [= Baz];
ã¢ã€ãã ã¯ããã®ASTããªã¢ã³ãã«ãã£ãŠå®çŸ©ãããŸãã ããã«ã¯ãå¢çïŒ Bar
ïŒãšïŒãªãã·ã§ã³ã®ïŒããã©ã«ãå€Baz
ãå«ãŸããŸãã ååã¯TraitItem
æ§é äœã§å®çŸ©ãããŠããŸãã
ãã¬ã€ãimplã®type Foo = Bar;
ã¢ã€ãã ã¯ããã®ASTããªã¢ã³ãã«ãã£ãŠå®çŸ©ãããŸãã Foo
ãªã©ãImplItem
ã§å®çŸ©ãããŠãããããã¿ã€ãBar
ã®ã¿ãå«ãŸããŸãã ImplItem
struct ã
ã¡ãœããã¯ãã§ã«æ±çšåã§ãããããèå³æ·±ãã±ãŒã¹ã§ãã ãããã®ãžã§ããªãã¯ãã©ã¡ãŒã¿ãŒã¯ã MethodSig
æ§é äœã®ãã£ãŒã«ãGenerics
ã§å®£èšãããŠããŸãã ããã¯Generics
æ§é äœã®ã€ã³ã¹ã¿ã³ã¹ã§ãã
ç§ã®èãã§ã¯ã Generics
ãã¡ãœããããTraitItem
ïŒããã³ImplItem
ïŒã«ããªãããããŠããã¹ãŠã®åœ¢åŒã«çããé©çšãããããã«ããã®ãæåã®æ¹æ³ã§ããç¹æ§ãšimplã¢ã€ãã ã ä»ã®ãšãããäžè¬çãªå®æ°ã¯ãµããŒãããªããšæããŸãããæ£çŽãªãšããããããã«ããããããã¯ããããç§ãã¡ãè¡ã£ãŠããäœæ¥ããå€ããã ããªã®ã§ãå°ããªæ¡åŒµã«ãªããŸãã ä»èšç»ãç«ãŠãã°ãä»äºã¯ãã£ãšããŸããããšæããŸãã
ããããããŸãšããªæåã®PRã¯ãä»ã®ãã¹ãŠã®æ¢åã®æ©èœãåãã«ä¿ã¡ãªããããã®å€æŽãè¡ãããšã§ãã ã€ãŸãã Generics
ãTraitItem
ïŒããã³ImplItem
ïŒã«è¿œå ãã$ïŒ$ MethodSig
ããè¿œå ããŸãã éã¡ãœããã«ã¯ç©ºã®Generics
ãæäŸããŸãã æ¢åã®ã³ãŒããåŠçããå¿
èŠã«å¿ããŠãžã§ããªãã¯ãé
管ããŠæ©èœãããŸãã
@nikomatsakisãã£ãããïŒ ã©ããããããšãïŒ ç§ã¯æšå€å®éšãå§ããŸããããASTã«ã€ããŠã®ã³ã¡ã³ãã§ããªããææããã®ãšåãå ŽæãèŠã€ããããšãèªãã«æããŸãã ïŒsmileïŒïŒrustcã¯åããŠã ã£ãã®ã§ããããææãšããŠæ°ããŸãïŒïŒ
ãžã§ããªãã¯ã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ã«ããåç
ããããã¿ã€ãããããšã®èœãšãç©Žã«é¢ããŠ
ãããããŸããããšæããŸã
ç§ããããããã®ãå«ãã£ãçç±
ã¡ãœãããšã¿ã€ãã«å¯ŸããŠïŒå°ãªããšãçè«çã«ã¯ïŒåãããšãæ¬åœã«ãããããšããããšã§ã
ãããŠ-ç§ãèšã£ãããã«-ååãšããŠãå®æ°ã«å¯ŸããŠåãããšãè¡ãããšãã§ããªãã£ãçç±ã¯ããããŸãã
Genericsãã¿ã€ãããªã¢ã³ãã«ç§»åããã ãã ãšæããŸã
ããã¯ããããããŸãããã§ãããããããªããèŠãŠã¿ããšãä»ãç§ãã¡ã¯ãã°ãã°ãå/å®æ°ã®ããã«1ã€ã®ããšãã¡ãœããã®ããã«1ã€ã®ããšããããªããã°ãªããŸããã
ã ããç§ã¯ã³ãŒãããã£ãšåäžã«ãªããšæã
æ£çŽã«èšããšã©ããªããããããããŸãã=ïŒ-ããã¯èŠçãããããŸãã
ããããspan_bugãæ¿å ¥ã§ããã®ã§ãå€ãã®å Žåãå¿ èŠä»¥äžã«äžè¬çãªãã®ã«ããããšã¯ããã»ã©æªããããŸããã ä»ã®ãšããäžå¯èœãªå Žåã«é»è©±ããããŸãïŒãããŠåŸã§ç§ãã¡ã¯åšãã«æ¥ãŠããããä¿®æ£ããŸãïŒ
ããã£ãïŒ æ¬¡ã®ã¹ãããã¯ãããŒãµãŒãæ¡åŒµããããšã§ãã ããã«ããã€ãã®ãã³ãããããŸãã ç¹æ§ã¢ã€ãã ããå§ããŸãããã
ãã®ã«ãŒãã³ã¯ãç¹æ§ã¢ã€ãã ã解æããŸãã é¢é£ããåãåŠçããã±ãŒã¹ãæ¡åŒµããŠã type Foo<....> = ...;
ïŒããããwhere-clausesïŒã®ãããªãã®ã解æããããšæããŸãã ïŒ <...>
ã¯ãASTã«è¿œå ããã°ããã®ããžã§ããªãã¯ãã§ããïŒ
çŸåšã parse_ty_param
ã䜿çšããŠããŸããããã¯ãåºæ¬çã«T: Foo
ãªã©ã解æããŸããé¢é£ä»ããããå宣èšã®ææ³ãåãã©ã¡ãŒã¿ãŒã®ææ³ãšäžèŽããªããªã£ãããããããåæ¢ããå¿
èŠããããŸãã ãããã£ãŠãããããparse_trait_item_assoc_ty
ã®ãããªãã®ãè¿œå ããããšæãã§ãããã ããã¯parse_ty_param()
ã®äžçš®ã®ã¯ããŒã³ãšããŠéå§ã§ããŸãããããã§parse_generics()
ãåŒã³åºãããã«å€æŽããå¿
èŠããããŸãã ãã®ã«ãŒãã³ã¯ããžã§ããªãã¯å®£èšïŒ <...>
ïŒãååšããå Žåã¯ããã解æããååšããªãå Žåã¯ç©ºã®ãžã§ããªãã¯ãè¿ããŸãã 次ã«ãããã«parse whereå¥ã®åŒã³åºããè¿œå ããŸããã¡ãœããã®è§£ææã«çºçããåŒã³åºãã§ã¢ãã«åã§ããŸããçµæã¯ãåã«è§£æããgenerics
ã«æ ŒçŽãããããšã«æ³šæããŠãã ããã
ãããå®äºãããšãããã€ãã®è§£æãã¹ããè¿œå ã§ããããã«ãªããŸãã src/test/run-pass/rfc1598-generic-associated-types/
ã®ãããªãã£ã¬ã¯ããªãäœæããããã«æ£åžžã«è§£æã§ãããšäºæ³ããããã¡ã€ã«ãè¿œå ããããšã§ããããå®è¡ããŸãã ä»ã®ãšããããããã¯æ£ããæ©èœããŸããããããã¯åé¡ã§ã¯ãããŸããã 空ã®mainé¢æ°ãè¿œå ããã ãã§ãã 次ã«ã src/test/ui/rfc1598-generic-associated-types/
ã«è§£æããŠã¯ãªããªãäŸãè¿œå ããããšãã§ããŸãïŒ UIãã¹ãã®è¿œå æ¹æ³ã«ã€ããŠã¯ã COMPILER_TESTS.md
ãåç
§ããŠãã ããïŒã
ä»ã®äœã-å®å®ãããã«ãã§ãã®ãããªãã®ã䜿çšãã人ãé¿ããããã«ããã®æç¹ã§ãã®äœæ¥ãæ©èœã²ãŒãããå¿
èŠããããŸãã ããã§forgeã«æ©èœã²ãŒããè¿œå ããããã®ããã€ãã®æé ããããŸãïŒæåŸã®ã»ã¯ã·ã§ã³ãåç
§ïŒã feature_gate.rs
ã®èšªåè
ã«$ visit_trait_item
ãšvisit_impl_item
ãè¿œå ããå¿
èŠããããŸã; ãã®ã¢ã€ãã ãã¡ãœããã§ã¯ãªããã空ã§ãªããžã§ããªãã¯ãå«ãŸããŠããå Žåã¯ã gate_feature_post
ãåŒã³åºãããšãã§ããŸãïŒäŸïŒã
åå解決ãèšå®ããã«ã¯ãé©åãªããªãããé 眮ããã ãã ãšæããŸãïŒåå解決æ©èœã¯ãã¹ã³ãŒãå ã®ååã®ã»ããããªãã«ç·šæããŸããåãªãã¯1ã€ã®ãã€ã³ãã£ã³ã°ã¬ãã«ãè¡šããŸãïŒã äŸïŒ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)
äžè¬ã«ãã¡ãœãããã©ã®ããã«æ©èœããããã¢ãã«åããããšã¯æªãèãã§ã¯ãããŸããã ããã§å°ããå°æ¥ã®ä¿èšŒããè¡ãããšãã§ãããšæããŸãã
ã¡ãœããã®åãã©ã¡ãŒã¿ãŒãã¹ã³ãŒãã«åã蟌ãã³ãŒãã¯æ¬¡ã®ãšããã§ãïŒããã¯ããã¬ã€ãã§å®çŸ©ãããã¡ãœããçšã§ãïŒã
ãã¬ã€ãã§å®çŸ©ãããtype
ã®å Žåã空ã®åãã©ã¡ãŒã¿ãŒribïŒ NoTypeParameters
ïŒãè¿œå ããããã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸãã
ãžã§ããªãã¯ã¹ããã¹ãŠã®trait/implã¢ã€ãã ã«é
眮ãããã®ã§ãããããtype
ã®åŠçãåé€ããã¡ãœããåŠçãæœåºããŠãããé«ãã¬ãã«ã§çºçããããã«ããããšæããŸãã ãžã§ããªãã¯ããªãã¢ã€ãã ïŒããšãã°ã const
ïŒã®å Žåãæ°ããå°å
¥ããããªãã¯ç©ºã§ãããããç¡å®³ã§ããå¿
èŠããããŸãïŒç§ã¯é¡ã£ãŠããŸãïŒã
ãã®ä»ã®èå³æ·±ãç¹ïŒ
type
ãèšå®ãããŠããŸãããªãã¯ãã®èããç解ããŸãã
@petrochenkov-æ£ãããšæããŸããïŒ
@nikomatsakis
æ£ããã§ããïŒ
ãã¹ãŠãæ£ããèŠããŸãã
次ã®ã¹ãããã ç涯ã®è§£æ±ºã
è¯ããæªãããããã¯çŸåšãä»ã®åå解決ãšã¯ãŸã£ããå¥ã®ã³ãŒãã§è¡ãããŠããŸãã ããã¯ãHIRãæ§ç¯ãããåŸã«è¡ãããããã§ãã ã»ãŒç¢ºå®ã«ããã¯å€æŽãããŸããããŸã å€æŽãããŠããŸããã
åºæ¬çãªèãæ¹ã¯éåžžã®åå解決ãšåãã§ãããããªããã§ã¯ãªããã¹ã³ãŒãããšåŒã¶ç¹ãç°ãªããŸãã =ïŒ
ãã®ãã¬ã€ãããŠã³ããã©ã€ãã¿ã€ã ã®æŠå¿µã®ããã«ãããã€ãã®è»œåºŠã®åé¡ããããŸãã ãã ããããã§ã¯å®éã«ã¯é¢ä¿ãããŸããããžã§ããªãã¯é¢é£ã¿ã€ãã®ãã¹ãŠã®ã©ã€ãã¿ã€ã ã¯ãæ©æãã€ã³ããã«ãªããŸããããã¯äžçš®ã®åçŽãªã±ãŒã¹ã§ãã ãã¬ã€ãããŠã³ããã©ã€ãã¿ã€ã ã¯ãã¡ãœãããåŒã³åºããããŸã§å€ãæäŸãããªãã¡ãœãããŸãã¯é¢æ°ã§å®£èšãããã©ã€ãã¿ã€ã ã§ãã ããã§ã¯ããã»ã©é¢é£æ§ããªããããããã§ã¯è©³ãã説æããŸãããäž»ãªããšã¯ãä»ã®åå解決ãšã¯ç°ãªããä»ã®çš®é¡ã®äžè¬çãªã¢ã€ãã ã®å ŽåãšãŸã£ããåãã¢ãã«ã®ã¡ãœããããã©ããããªããšããããšã§ããã±ãŒã¹ã
ãããã³ãŒãã®äŸã§ãã ããã¯ã impl
ã struct
ããŸãã¯ãã®ä»ã®éæ©èœã¢ã€ãã ã«ã¢ã¯ã»ã¹ããã³ãŒãã§ãã ãããã®å ŽåãGATã®å Žåãšåæ§ã«ãåºæ¬çã«ã Generics
ã®ãã¹ãŠã®ã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ãã¹ã³ãŒãã«åã蟌ã¿ããããããæ©æãã€ã³ããã©ã€ãã¿ã€ã ã«ãããã³ã°ããŸãã
æåã«ã©ã€ãã¿ã€ã ã®ãã¯ãã«ãäœæããããããã«å¯ŸããŠRegion::early
ãåŒã³åºããŠããããšãããããŸãã
次ã«ã Scope
ãäœæããŸãã next_early_index
å€æ°ã¯ãã¹ã³ãŒãå
ã«ããã¢ãŒãªãŒããŠã³ãã©ã€ãã¿ã€ã ã®æ°ãã«ãŠã³ãããŠããã ãã§ãã ãã®ã³ãŒãã¯ã¢ã€ãã ã«åºæã§ãããããããã¯åžžã«ããã®çŸåšã®ã¢ã€ãã ã§å®£èšãããã¢ãŒãªãŒããŠã³ãã©ã€ãã¿ã€ã ã®æ°ã«ãªããŸãã ïŒåŸã§ãè¿œå ã®ã©ã€ãã¿ã€ã ãã¹ã³ãŒãã«è¿œå ããå Žåãæ€èšããŸããããã¯ãGATã«å¿
èŠãªãã®ã§ããïŒ
æåŸã«ã with()
ãåŒã³åºããŸãã ãã®ã¡ãœããã¯ãã¹ã³ãŒããã¹ã³ãŒãã«åã蟌ã¿ãã¯ããŒãžã£ãåŒã³åºããŸãã ãã®ã¯ããŒãžã£å
ã§ã¢ã¯ã»ã¹ãããã¹ãŠã®ã©ã€ãã¿ã€ã ã«ã¯ãã¹ã³ãŒãå
ã«ãããšå®çŸ©ããååã衚瀺ãããŸãã
ã§ã¯ããã1ã€ã®äŸãèŠãŠã¿ãŸãããã ãã®ã±ãŒã¹ã¯ãimplç¹æ§ããã«ããŒããŸãã ãããè¡ã£ãŠããããšã®è©³çŽ°ã¯ããã»ã©éèŠã§ã¯ãããŸããïŒã€ãŸãã impl Trait
ã®è±ç³èªäœãè¡ãå¿
èŠã¯ãããŸããïŒã ããã¯ãããã€ãã®æ°ããåæã®ã©ã€ãã¿ã€ã ãã¹ã³ãŒãã«ãããããŠãããšèšãã°ååã§ã-ããã¯ãŸãã«ç§ãã¡ãGATã®ããã«ããããããšã§ãã
ããã€ã匷調ããŠãããŸãã ãŸããã¡ãœããnext_early_index
ã¯ã次ã®å²ãåœãŠãããŠããªãã¢ãŒãªãŒããŠã³ãã€ã³ããã¯ã¹ãè¿ããŸãã
ãããåºçºç¹ã§ãã 次ã«ã Region::early
ãå床䜿çšããŠã以äžã«å¯ŸããŠè§£æ±ºãããæ°ããã¢ãŒãªãŒããŠã³ãã©ã€ãã¿ã€ã å®çŸ©ãäœæããŸãã
æåŸã«ã with
ãå床åŒã³åºãããšã§ãããããã¹ã³ãŒãã«å
¥ããŸãã
OKããããã¯2ã€ã®äŸã§ãã 2çªç®ã®ãããªããšãããããšæããŸãã ããã2ã€ã®ã¡ãœããã®å®çŸ©ãå€æŽããå¿ èŠããããŸãã
ã©ã¡ãããé¢é£ããã¿ã€ãã«ã€ããŠãé¢é£ãããžã§ããªãã¯ãåŠçããå¿ èŠããããŸãã ïŒä»ã®å Žåã«ã¯ããžã§ããªãã¯ã空ã§ãããšäž»åŒµããå¿ èŠããããŸããïŒ
ããã§ãç§ã¯ä»æ¥æ©ãããã«é£ã³ã€ããŸããã ç§ã¯æ£ããè»éã«ä¹ã£ãŠããããšã確èªããããšæããŸãïŒ
type parameters are not allowed on this type
ãšã©ãŒãä¿®æ£ããããã«ã qpath_to_ty
ãšassociated_path_def_to_ty
ã®åãã©ã¡ãŒã¿ãŒã®çŠæ¢ã$ïŒ$ librustc_typeck/astconv.rs
$ïŒ$ã«åé€ããŸããã ããã€ãã®ãã§ãã¯ã«çœ®ãæããå¿
èŠããããšæããŸãã ãŸã...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 ãããªãã®ç±æãšå©ããŠãããæ欲ã«æè¬ããŸãã :)ç§ã¯ç¢ºãã«ããã«ç©æ¥µçã«åãçµãã§ããŸãã ãã³ãšç·å¯ã«ååããªãããå®è£ ã®åéšåã段éçã«é²ããŠããŸããã
ç§ã¯ãããã§ããã ãæ©ãåãé€ãããã«ã§ããéãã®ããšãããŸãã ç§ããã®æ©èœãæ¬åœã«æ¬²ããã§ãïŒ
é²æç¶æ³ã¯ã©ãã§ããïŒ =ïŒæ¯æ©<3ã§ãããè©Šãã®ãåŸ ã¡ãããŸãã
GATãšconstãžã§ããªãã¯ã®æé¢ã¯ã©ã®ããã«æ©èœããã®ã§ããããããŸãããŸãšãããšãã«ææ¡ã®äžéšã ã£ãã®ã§ããããã
ç§ãèšã£ãŠããããšã®äŸïŒ
trait Foo {
type Bar<const N>;
}
ããã«ã¡ã¯@sunjayããã¯éåžžã«éèŠãªæ©èœã ãšæããŸãã2018幎ã®ããŒããããã®ã³ã¡ã³ãã§é »ç¹ã«èšåãããŸããã é 調ã«é²ãã§ããŸããïŒ ããªãã®ä»äºãããããšãïŒ
ããã¯ãçŸæç¹ã§ç§ã®æãæãŸããæ©èœã§ãã ãããåªå äºé ã«ãªããããã«æ¯æ©ãã®éãèŠã€ããããšãé¡ã£ãŠããŸãïŒ
ããã§æè¿ãåŠæ ¡ãªã©ã§å¿ãã@sunjayã«äŒãã次ã®ã¹ããããèããŠã¿ãŸããã 圌ããšç§ã¯ããæç¹ã§äŒããå šäœçãªå®è£ æŠç¥ã«ã€ããŠè©±ãåããæçµçã«åœŒãã®ãªããžããªã«ã³ãããããã€ã³ã©ã€ã³ã³ã¡ã³ããããããæ®ããŸããã
ä»åŸæãçã«ããªã£ãŠããæŠç¥ã¯2ã€ãããšæããŸãã
ãŸããããã€ãã®åœä»€reïŒtestsãäœæããããšããå§ããŸããããã¯ããã¹ãã®æ¹ãããã«å®è¡ã§ããããã§ããä»é±ã®åŸåã«ãæ®ãã®èšèšãã©ã®ããã«æ©èœããããããã³ã³ãŒããçŸåšã®å ŽæããååŸããæ¹æ³ãèšè¿°ããŸããä»ãããå¿ èŠãªå Žæã«ã
ããã¯çŽ æŽãããã§ã ïŒïŒ ãããšä»ã®ãã¹ãŠã®åªåã§@sunjayã«å¹žéãç¥ããŸãã
æåã®ã¹ãããã¯ãå®å šãªãã¹ãã¹ã€ãŒããããããšã確èªããããšã§ãã æ¢åã®ãã¹ãã¯æ¬¡ã®å Žæã«ãããŸãã
src/test/ui/rfc1598-generic-associated-types
ããããèŠãã ãã§ãå®è¡ããå¿ èŠã®ããäœæ¥ã®äžéšããã§ã«ç¢ºèªã§ããŸãã
construct_with_other_type.rs
-äºæããªãE0110ãšã©ãŒãçºçããŸãempty_generics
- type Bar<,>
ã§ãšã©ãŒãçºçããããšã確èªããåé¡ãªãããã§ã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>
ã¯ãããŸãã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
ã«ãã£ãŠå ±åãããŸãïŒ
æåã®ã¹ãããã¯ããããã©ãããåŒã³åºãããŠããããææ¡ããããšã§ãã ãããè¡ãããã®ç§ã®å¥œãŸããæ¹æ³ã¯ãããŒã«ã«ãã«ããååŸãã -Ztreat-err-as-bug
ãRUST_BACKTRACE=1
ãšçµã¿åãããŠäœ¿çšââããããšã§ãã ããããrustcã¯ãŸã æ§ç¯äžã§ããããããããã®çµæã衚瀺ããããšã¯ã§ããŸããã ïŒP代ããã«ãç°¡åãªrg prohibit_type_params
ãå®è¡ããŸããã次ã«ãçãããã±ãŒã¹ã1ã€ææããŸãã
1ã€ã®åŒã³åºãã¯associated_path_def_to_ty
ããã§ãïŒ
ã³ã¡ã³ãã瀺ãããã«ãããã¯Self::Pointer<T>
ã®ãããªãã¹ã®Pointer<T>
ã³ã³ããŒãã³ãã解決ããããã«åŒã³åºãããŸãïŒã¿ã€ããã©ã¡ãŒã¿ãŒã¯ãããããæ¥ç¶ãããŠããååãšãšãã«ããã¹ã»ã°ã¡ã³ãã®äžéšãšèŠãªãããããšã«æ³šæããŠãã ããïŒ ïŒã GATãç»å ŽãããŸã§ãã¿ã€ããã©ã¡ãŒã¿ã¯ããã§ã¯åæ³ã§ã¯ãªãã£ãããïŒããšãã°ã T::Item
ïŒãå
æ¬çãªå¶éããããŸãã
æããã«ããã¯ããŸããã ãã®è¡ãåé€ããŠããã©ã¡ãŒã¿ãæå®ãããŠããå Žåã¯ããããæåŸ
ãããæ°ãšäžèŽããããšã確èªããäœããã®ãã§ãã¯ã«çœ®ãæããå¿
èŠããããŸãã ãããè¡ãã«ã¯ããããã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ã«é¢é£ãããã¹ãŠã®ãã®ãæ€çŽ¢ããŸããã ãããã£ãŠããã®æ©èœã«é¢ãããã¹ãŠã®æ å ±ãèŠçŽããããšæããŸãã å€åããã¯äœäººãã®äººã ã«åœ¹ç«ã€ã§ãããã ã§ãäœãããããªãã®ã§ããããäžç²ã®å¡©ã§ã©ããïŒ ãŸããä¿®æ£ã§ããããã«ãäžéšã®æ å ±ãæ£ãããªãå Žåã¯æããŠãã ããã
@sunjayã¯2ã€ã®çŽ æŽãããPRãäžéžãããŸããïŒ
ãã®åŸããã°ããã®éãå€ãã¯èµ·ãããŸããã§ããã ãã®åŸããã³ã¯ãã®ã³ã¡ã³ãã§ãŸã äœãå¿ èŠããèŠçŽããŸããïŒ2018-03-12ïŒã åºæ¬çã«ãïŒaïŒæžã蟌ã¿ãã¹ããïŒbïŒããŒãµãŒ/ããã³ããšã³ãã®ãã°ã®ä¿®æ£/æ¹åãããã³ïŒcïŒãã¬ã€ãã·ã¹ãã ã§ã®å®è£ ã ãã€ã³ãïŒaïŒã¯ããã®ã³ã¡ã³ãïŒ2018-03-13ïŒã§ããã«èª¬æãããŠããŸãã
@gaventoãRFC1598ïŒGATïŒã®æ¡åŒµãã¹ããéå§ããŸããïŒ 2018-05-11ã«çµ±åïŒ
ãã以æ¥ã UIãã¹ãã¯è¿œå ãããŠããŸããã ãŸããGATã«çŽæ¥é¢é£ããä»ã®PRã¯èŠã€ãããŸããã
ãã ããäžããã®ãã€ã³ãïŒcïŒïŒåœ¢è³ªã·ã¹ãã ïŒã¯ãç§å¯è£ã«ãåãçµãã§ããŸãã ç§ãç解ããŠããéããèšç»ã¯ããã«æ°ãããã§ãŒã¯ããŒã¹ã®ç¹æ§ãœã«ããŒã«ç§»è¡ããå€ãã·ã¹ãã ã§GATãæ©èœãããªãããšã§ãã æ°ããç¹æ§ãœã«ããŒã®çµ±åã¯ãããã§ãŒã¯åã远跡åé¡ã«ãã远跡ã§ãã ãã§ãŒã¯ãšãã§ãŒã¯åã«é¢é£ããPRã¯ããªããããŸãã ç¹ã«ã ãFinishimplementingGATsã ïŒ2018-05-24ã«çµ±åïŒãšåŒã°ãããã§ãŒã¯PRããããŸãã ãããã£ãŠãGATã®ã³ã¢ã·ã¹ãã ã¯ãã§ã«æŽã£ãŠããããã§ãã
ãšã¯èšããã®ã®ããã§ãŒã¯ã®ãGATãã¯ãããã¿ã€ãã®å®è£
ã§ãããrustcã§ããã䜿çšããããšã¯åãªãuse chalk;
ã§ã¯ãããŸããã @scalexmãç§ã«èšã£ãããã«ãã[ããã¹ãããš]ã¯ããªãããããããããã§ããã
詳现ãšæ¯æŽã«ã€ããŠã¯ã #wg-traits
Discordãã£ãã«ãšç¹æ§WG远跡ã®åé¡ã調ã¹ããšåœ¹ç«ã€ã§ãããã
ãã®ããã @ nikomatsakisã¯rust-langäžåãµãŒããŒã«#wg-traits-gat
ãã£ãã«ãäœæããŸããïŒããã«åå ããŠãã ããïŒã ããã§å©ããããšæã£ãŠãããã¹ãŠã®äººãè¿ããããšãã§ããã°çŽ æŽããããšæããŸãã ããã«ããã®æ©èœã®ã¹ããŒã¿ã¹ïŒç¹ã«ããŸã äœãããå¿
èŠãããã®ãââãã©ãã§æ¯æŽã§ããã®ãïŒãç¥ã£ãŠããæ°äººã®äººã
ã ããã«ãããç¹ã«ããŸã æ·±ãé¢ãã£ãŠããªã/ç¹æ§WGã®äžéšã§ããç§ã®ãããªäººã
ã«ãšã£ãŠãã³ãã¥ãã±ãŒã·ã§ã³ãããç°¡åãã€è¿
éã«ãªãã¯ãã§ã:)
æè¿ãããã«é¢ããæŽæ°ã¯ãããŸããïŒ Chalkãã³ã³ãã€ã©ã«çµ±åãããã®ãåŸ ã£ãŠããŸããïŒ ïŒããããããã®ããã®å¥ã®åé¡ããããŸããïŒ
ããããããã®ããã®å¥ã®åé¡ããããŸãã
泚ïŒããããæ¢ç¥ïŒãšåæ§ã«ããã®ã³ãŒãã¯ã³ã³ãã€ã©ãŒããããã¯ã«ããŸãã
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]; }
@wdanilo ïŒããã¯https://github.com/rust-lang/rust/issues/64755ã ãšæããŸãã
@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ã§ãç§ã¯æ¬¡ã®ããšãè©ŠããŸããã
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;
}
}
ããã¯ã³ã³ãã€ã©ããããã¯ã«ããŸããã
ç§ã®è³ªåã¯æ¬¡ã®ãšããã§ãã
ãæéãå²ããŠããã ããèª ã«ããããšãããããŸãã
@clintonmeadæçµçã«ã¯å¯èœã«ãªãã¯ãã§ãããæ©èœã®å®è£ ã¯ãŸã å®äºããŠããŸããïŒå®éãã³ã³ãã€ã©ã¯ã䜿çšããããšãããšã¯ã©ãã·ã¥ããå¯èœæ§ãããããšãèŠåããŠããŸãïŒïŒã ã¿ã€ã ã©ã€ã³ãããããŸããã
ããããããã®æ©èœã®äœæ¥ãåéããããã«çµ±åãååã«é²ãã§ãããã©ããããã§ãŒã¯ã®äººã«ç¢ºèªãã䟡å€ããããŸããïŒ
ããã¯çŸåšãããã¯ãããŠããŸã
çŸåšã®ãããã«ãŒã§åé¡ã®èª¬æãæŽæ°ã§ããŸããïŒ
@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{}
ç§ã®ç¹æ§ã®ãã¹ãŠã®å®è£ è ãããã¥ãŒã¿ã€ããïŒf64ãã©ããããåäžèŠçŽ ã®ã¿ãã«æ§é äœïŒã«å¶éã§ããããã«ããããšæããŸãã
ææ¡ãããå®è£ ãããã§æ€èšããããšã§ãããã¯å¯èœã§ããããïŒ
以äžã¯ç¢ºãã«å°ãå¥åŠã«èŠããŸãããããŸãããã°ç§ãããããããšã瀺ããŠããŸãã
trait TradeableResource{
type Wrapper<T>:T(f64)
}
@ChechyLevasã¯ãç§ãç¥ãéããããã¯GADTã®ç¯å²å ã§ã¯ãããŸããã
ããããããªããããããããšã¯ãç§ãéããããšãã§ãããã®ãããããããã¥ãŒã¿ã€ãã§ãããšããä¿èšŒãããããã代ããã«ããããå éšå€ãã©ããããŠååŸããé¢æ°ãå¿ èŠãšããå Žåãæåã«GADTãå¿ èŠãšããŸããã ããã»ã©äŸ¿å©ã§ã¯ãããŸããããããããååã«æ©èœããã¯ãã§ãã
ãããã£ãŠã次ã®ããšãã§ããŸãã
trait Traceable resource: From<f64> + Into<f64> { }
ïŒããã«ã¯ãåæ¹åã§From
ãå®è£
ããå¿
èŠããããŸããããã¯ããã¯ããä»ããŠè¡ããŸãïŒ
çŸç¶ãå°ãæããŠã¿ãããšæããŸãã ç§ã¯éåæã®ç¹æ§ãšç涯ã§å°ãéãã§ããŸãã
ç§ãããããã£ãããšã®1ã€ã¯ãé¢é£ãã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ãäžèŽãããããã«ãäžèšã®ã¹ãããããæ©èœããå¯èœæ§ããããŸã;-)ïŒ
ã¿ã€ããã©ã¡ãŒã¿ã§ã¯ãªãã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ã®ã¿ã䜿çšããŠããã®ã§ãã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ãvtablesãšã¿ã€ããµã€ãºã«äœããã®åœ±é¿ãäžããå¯èœæ§ããªãéããããã¯æè¡çã«å¯èœã§ãããšæããŸããïŒ
@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ãé©çšããããšããŸããããïŒä»ã®ãšããïŒ1ã€ã®ãšã©ãŒããã¹ããŒãããŸããããåè¿°ã®åé¡ã®ä¿®æ£ã«äŸåãããããåçŽã«ä¿®æ£ããããšã¯ã§ããŸããã
ã¢ãŠãã©ã€ãããŠã³ãã¯ãé¢é£ä»ããããã¿ã€ãã«è¿œå ã§ããŸãïŒãã¬ã€ãã®ããŒãžã§ã³ã§Self: 'ast
ã䜿çšïŒã ãã®ãã¹ãã¯ããããã©ã®ããã«èŠãããã瀺ããŠããŸãã
https://github.com/rust-lang/rust/blob/db4826dd6ca48663a0b4c5ab0681258999017c7d/src/test/ui/generic-located-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
ã³ãŒãã1ã€ã®ã¹ããŒãžãééãããšïŒä»¥åã¯åæ§ã®ãšã©ãŒã§ãšã©ãŒãçºçããŸãããããããã®éã«ã E0107
sã®ã¿ã§æ§æãããå¥ã®ã«ããŽãªã®ãšã©ãŒã衚瀺ãããŸããïŒ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>,
解æããããŸããïŒã +
ã ,
ã ::
ããŸãã¯>
ã®ãããããèŠã€ããã =
ãèŠã€ãããŸãããïŒã
self.clone().map
ã®ç¹æ§åºåã¿ã€ãã¯ãå®éã«ã¯O::as_unindented
ã®ã¿ã€ããã€ãŸããããã®åŒæ°ã¿ã€ãã§ããïŒ
crate::View
ãäœã§ãããã¯ããããŸãããã map
é¢æ°ã¯å¥ã®åŒæ°ãäºæããå¯èœæ§ããããããåãäžèŽããŸããã
@sighoya以åã®æçš¿ã§ãªããžããªããªã³ã¯ããŸãããããã¯ã crate::view::ViewFn::map
ã®å®è£
ãžã®çŽæ¥ãªã³ã¯ã§ãã
ã³ã³ãã€ã©ã¯ããã«ã€ããŠäœãšèšã£ãŠããŸããïŒïŒ
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
ã®å®è£
ã1ã€ãããŸãã
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ã®ç§ã®æãŸãã䜿çšæ³ã®ã»ãŒãã¹ãŠã¯ã1ã€ã®ã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ãŒã®ã¿ãå¿ èŠãšããŸãã åæžãããç涯ã®ã¿ã®ããŒãžã§ã³ã®GATã¯ãããç°¡åã«æäŸã§ããã§ããããïŒ
https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656ã¯ïŒããç°¡æœãªïŒæŽæ°ã§ãã
ãã®RFCã¯Monad
ãšFunctor
ãçŽæ¥å¯èœã«ããŸããïŒ ãããšããHKTã§å®è¡ããå¿
èŠã®ããäœæ¥ãä»ã«ãããŸããïŒ
ãã®RFCã¯ãMonadãšFunctorãçŽæ¥å¯èœã«ããŸããïŒ ãããšããHKTã§å®è¡ããå¿ èŠã®ããäœæ¥ãä»ã«ãããŸããïŒ
@ibraheemdevRFCã¯è¿°ã¹ãŠããŸã
ããã¯ã人ã ãããé«ãçš®é¡ã®ã¿ã€ãã«ã€ããŠè©±ããšãã«å¿ èŠãªãã¹ãŠã®æ©èœãè¿œå ããããã§ã¯ãããŸããã ããšãã°ãã¢ããã®ãããªç¹æ§ã¯æå¹ã«ãªããŸããã ãããã®æ©èœããã¹ãŠäžåºŠã«äžç·ã«å®è£ ããããšã奜ã人ãããŸãã ãã ãããã®æ©èœã¯ä»ã®çš®é¡ã®é«çš®é¡ã®ããªã¢ãŒãã£ãºã ãšäžäœäºææ§ãããããããã®å®è£ ã劚ãããã®ã§ã¯ãããŸããã å®éãéšåé©çšãªã©ãä»ã®çš®é¡ã®ããé«åºŠãªãã®ã«ã圱é¿ãäžããããã€ãã®å®è£ ã®è©³çŽ°ã解決ããããšã§ãéãåãéããŸãã
@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ã§ããé«çš®é¡ã®ã¿ã€ãããšãã¥ã¬ãŒãããæ¹æ³ãåç §ããŠãã ããã ä»ã§ãå®å®ããŠåäœããŸãã
æãåèã«ãªãã³ã¡ã³ã
https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656ã¯ïŒããç°¡æœãªïŒæŽæ°ã§ãã
67510ã¯ãå®è£ ãå¿ èŠãªæåŸã®äž»èŠãªICE/æ¬ èœæ©èœã§ãã