ïŒRust 1.7å®å®çã«ã€ããŠæžãããèšäºïŒ
Ruståã·ã¹ãã ã«ã¯ãããã¹ãããšããããããããŸãã ç§ã®ç¥ãéããããã®ã»ãšãã©ãã¹ãŠã®è€éãã¯ãããã°ã©ã ãæãäžè¬çãªæ¹æ³ã§è¡šçŸããããšã§ãã ããã«ã人ã ã¯ãŸã å€ããå¿ èŠãšããŸãïŒ ãã®æçš¿ã¯èªåèªèº«ãæãåºãããå¯èœæ§ãé«ãã®ã§ãç§ã¯åžžã«æãè€éãªããšãç°¡åã«ç解ããã®ã«åé¡ããããŸããã ããã«ãããããããç§ã¯ä»ã®äººã«ãšã£ãŠæçãªããšããããã®ã§ããã®èšäºã«ã¯å¿ããããšã¯ãªãããäžéšã¯ç¥ããªãããšããããŸãã
ãã®èšäºã§ã¯ãæ§æã®å æ¬çãªèª¬æãã説æãããŠããæ©èœã®äžè¬çãªè©³çŽ°ã«ã€ããŠã¯èª¬æããŸããã ç§ã¯ãã€ããã®ãããªããšãå¿ããŠããã®ã§ã ãªããããäœããã®åœ¢ã§èµ·ãã£ãŠããã®ãã説æããŸãã Rustãå®å šã«åŠç¿ããããšããŠãã®èšäºãèŠã€ããå Žåã¯ãå¿ ãæ¬ãèªãããšããå§ããŠãã ããïŒãªãªãžãã«ã¯ããã«ãããŸã -çŽPerãïŒã åæã«ãç§ã¯ããã§äœãèµ·ãã£ãŠãããã®arbitraryæçãªçè«çåŽé¢ãããã€ãæããã«ããŸãã
ã»ãšãã©ã®å Žåããã®èšäºã¯ãšã©ãŒã§ãã£ã±ãã§ãããå ¬åŒã®ãªãŒããŒã·ãããè£ ãã¹ãã§ã¯ãããŸããã ããã¯ãæ°ããä»äºãæ¢ããŠãããšãã«1é±éã§æãåºãããã®ã®ã³ã¬ã¯ã·ã§ã³ã§ãã
ã³ãŒãåå©çšååã®æŠèŠ
ïŒä»¥éããåå©çšããšã¯ãåå©çšããæå³ããŸã-ããã»ã©åä»ãªé³ã§ã¯ãªããããæ©ãç解ãããŸã-çŽperãïŒ
ã³ãŒãã®äžéšãè€æ°å䜿çšããããšããèŠæã¯ãæåã®ã³ã³ãã¥ãŒã¿ãŒãæåã®æçšãªçµæããããååŸããæåã®é ããååšããŠããŸããã 確ãã«ãã³ãŒããåå©çšããããšã§ãã®çŽ æŽãããææãã©ã®ããã«èŠããã®ããç§ã«ã¯ããããŸããã ãã¶ãããããŒãããã®èïŒ ãŸãã¯ãã³ãã«ãŒãã®å±±ïŒ ããããªãã ç§ã¯ãããä»ã©ã®ããã«è¡ããããã«ãã£ãšèå³ããããŸãã
æãããç¥ãããŠããã³ãŒãã®åå©çšåœ¢åŒã¯ãæç¶é¢æ°ã§ãã ãããã¯ããæ©èœã¯èª°ããç¥ã£ãŠããŸãã ãã ããäœæããŠããèšèªãšå®è¡ããå¿ èŠãããå 容ã«ãã£ãŠã¯ãã³ãŒãã®åå©çšãåãåããªã©ã®æ©èœã®æ©èœãååã§ãªãå ŽåããããŸãã ããããããã¡ã¿ããã°ã©ãã³ã°ãïŒã³ãŒããããèªäœãäœæãããšãïŒãŸãã¯ãããªã¢ãŒãã£ãºã ãïŒã³ãŒããããŸããŸãªã¿ã€ãã®ããŒã¿ã«é©çšã§ãããšãïŒãšããçŸä»£çšèªã®äžã«ååšããäœããé©çšããå¿ èŠããããŸãã
æè¡çã«ã¯ããããã®ååã¯å®å šã«ç°ãªããŸããããã°ãã°äžç·ã«äœ¿çšããå¿ èŠããããŸãã çŸä»£ã®èšèªã§ã¯ããã¯ãããã³ãã¬ãŒãããžã§ããªãã¯ãç¶æ¿ãé¢æ°ãžã®ãã€ã³ã¿ãŒãã€ã³ã¿ãŒãã§ã€ã¹ããªãŒããŒããŒããã°ã«ãŒãåïŒãŠããªã³ïŒãªã©ããããã®ååã®å®è£ ã¯éåžžã«åºãè¡šçŸãããŠããŸãã ãã ããããã¯ãã¹ãŠã3ã€ã®åºæ¬ååïŒåçžæ§ãä»®æ³åãåæïŒã®å®è£ ã®æå³çãªå€æ§æ§ã«ãããŸããã
åçž
åçžæ§ãšã¯ãåºæ¬çã«ã³ãŒãã®ã³ããŒãšè²Œãä»ãã®ç·Žç¿ã§ãããæ°ããã³ããŒããšã«å°ããªå€æŽãå ããããŸãã åçžæ§ã®äž»ãªå©ç¹ã¯ãè€éãªæ§é ã§ã³ã³ãã€ã©ãæããããããšãªããå®è£ ããå®å šã«ã«ã¹ã¿ãã€ãºãã§ããããšã§ãã ãããååã®äž»ãªæ¬ ç¹ã§ã-ææªã®å Žåã䜿çšããããã¹ãŠã®å Žæã«ç©ççã«ã³ããŒãããå€ãã®ã»ãŒåäžã®éšåã®ããã«ãããªã倪ãã³ãŒããååŸããŸãã ã·ãã¯ãã€ããªãšã³ã³ãã€ã«æéã®å¢å ã«å ããŠãããã»ããµã®åœä»€ãã£ãã·ã¥ãžã®èšå€§ãªè² è·ãããã«è¿œå ãããŸãã å®éãããã§ã³ãŒããåå©çšããèãã¯ãããŸããïŒ
åçžæ§ã®æå³äžã®å¶éã¯ãè€æ°ã®ç°ãªãããŒã¿åãåæã«åŠçããéã«ïŒçŽæ¥ïŒäœ¿çšã§ããªãããšã§ãã ããšãã°ãããŸããŸãªã¿ã¹ã¯ãåãå ¥ãããžã§ããã¥ãŒãäœæããããã䜿çšããŠãããã®ã¿ã¹ã¯ãåä¿¡é ã«å®äºãããããšããŸãã ãã¹ãŠã®ã¿ã¹ã¯ãåäžã§ããã°ããã¹ãŠãåçžã«ãã£ãŠç°¡åã«è§£æ±ºãããŸãã ã¿ã¹ã¯ãç°ãªããšåé¡ãçºçããŸãããããåçžæ§ã ãã§å®è£ ããæ¹æ³ãäžæ確ã«ãªããŸãã ãããã£ãŠã圌ã®ååã¯åå°ã§ãã 1ã€ã ãã®ããšãè¡ãã³ãŒãã®æœè±¡åã
åçžæ§ã®äžè¬çãªäŸïŒC ++ãã³ãã¬ãŒããCãã¯ããGo GenerateãCïŒãžã§ããªãã¯ã ãããã®ã»ãšãã©ã¯ã³ã³ãã€ã«æã«æ©èœããŸãããCïŒãžã§ããªãã¯ãé€ããå®è¡æã«ã¢ãã¢ãŒãã«ãªããŸãã ã³ã³ãã€ã«äžã«äœæããããã®ã¯ãã¹ãŠãã³ãã¬ãŒãã§ãã åçžæ§ã¯ãåŸæ¥ã®ïŒã€ã³ã©ã€ã³ïŒããã³JITã³ã³ãã€ã«ã䜿çšããæé©åã®æ段ãšããŠéåžžã«äººæ°ããããŸãã
ä»®æ³å
ãã¹ãŠã®éçºè ããã£ãŠãããã³ããŒã»ã¢ã³ãã»ããŒã¹ãã«ååãªåœ¹å²ãæãããåçžæ§ã®æ£å察ïŒã¢ããªã±ãŒã·ã§ã³ã®å€æ§æ§ãåŒãç· ããŸãã ããŒã¿ãšå®è¡å¯èœã³ãŒãã®äž¡æ¹ãä»®æ³åããããšãã§ããŸãããã®åŸãä»®æ³ã€ã³ã¿ãŒãã§ã€ã¹ã®ãŠãŒã¶ãŒãèŠããã®ã¯ãã¹ãŠã äœããæããã®ã«ãªããŸãã
ä»®æ³åã«ãããã³ãŒãã¯ãµã€ãºãæ§é ãç°ãªãã¿ã€ãã§ããŸã£ããåãããã«æ©èœããŸãã é¢æ°ã®ä»®æ³åã«ãããã³ããŒãšè²Œãä»ããè¡ããã«ä»£æ¿ã®åäœãå®çŸã§ããŸãã åçžæ§ãæ¯ãå£ãå®è¡ãã¥ãŒã®äŸã¯ãä»®æ³åã«ãã£ãŠå®å šã«è§£æ±ºãããŸããå®è¡ããå¿ èŠãããã¿ã¹ã¯ã¯ãæ€åºããã³èµ·åã§ããæ©èœãžã®ãã€ã³ã¿ãŒã§ãã ã¿ã¹ã¯ããšã«åå¥ã«ããŒã¿ãå¿ èŠã§ã-質åãªããããŒã¿ã«å¥ã®ãã€ã³ã¿ãŒãè¿œå ãããšãé¢æ°ã«ããŒããããŸãã
ä»®æ³åã®äž»ãªæ¬ ç¹ã¯ã éåžžãããã©ãŒãã³ã¹ã«åœ±é¿ããããšãã³ãŒãã®å€åæ§ãããŒãäžã®ã¡ã¢ãªã®é »ç¹ãªå²ãåœãŠã«å€æãããããšããã€ã³ã¿ãŒã®ãžã£ã³ãïŒãã£ãã·ã¥ãdããŠããããšïŒãããã³çŸåšäœãåŠçããŠããããæ£ç¢ºã«æ±ºå®ããããšã§ãã
ãã ããä»®æ³åã¯åçžåãããçç£çã§ãïŒ é¢æ°ãéçã«ãžã£ãŒã¯ãããã³ã«ãã³ã³ãã€ã©ãŒã¯ãããã€ã³ã©ã€ã³åã§ããŸãããæ¢ã«è¿°ã¹ãããã«ããã€ããªãŒããªãŒããŒããŒãããŠãªã¿ãŒãããããåžžã«ãããè¡ããšã¯éããŸããã åãçç±ã§ããã£ãã«äœ¿çšãããªãæ©èœã匷å¶çã«ä»®æ³åããããšã¯æçã§ãã ããšãã°ãäŸå€ãã³ãã©ã¯åžžã«å®è¡ããå¿ èŠã¯ãªããããäŸå€ãã³ãã©ãä»®æ³åããŠãããšã©ãŒã®ãªããå®è¡ãã©ã³ãã®åœä»€ãã£ãã·ã¥ãã¯ãªã¢ããããšããå§ãããŸãã
äžè¬çãªä»®æ³åã®äŸïŒCã®é¢æ°ãã€ã³ã¿ãŒãšvoidãã€ã³ã¿ãŒãã³ãŒã«ããã¯ãç¶æ¿ãJavaãžã§ããªãã¯ãJavascriptãããã¿ã€ãã ãããã®äŸã®å€ãã§ã¯ãããŒã¿ä»®æ³åãšå®è¡å¯èœã³ãŒãã®éã«éãã¯ãªãããšã«æ³šæããŠãã ããã ããšãã°ã åç©ãžã®ãã€ã³ã¿ãããå Žåã ç«ãšç¬ã®äž¡æ¹ããã®åŸãã«ç«ã€ããšãã§ãããã®åç©ã«æ祚ãäŸé ŒãããšãïŒïŒ -圌ã¯ã©ããããç¥ã£ãŠãããããŠãŒãããŸãã¯ããã£ãŒããæããŠãã ããã
åã¿ã€ãã®åãªããžã§ã¯ãã«ä»®æ³åãå®è£ ããéåžžã®æ¹æ³ã¯ããvtableããšåŒã°ããããã°ã©ã ã®åäœäžã«å¿ èŠã«ãªãå¯èœæ§ã®ããããŸããŸãªå®è£ ãžã®ãã€ã³ã¿ã®é ãããã¹ãã¬ãŒãžã®ç¶æ¿ã®éå±€ã§ãã éåžžãvtableã«ã¯é¢æ°ïŒäžèšã®äŸã®voiceïŒïŒãå«ãïŒãžã®äžé£ã®ãã€ã³ã¿ãŒãæ ŒçŽãããŸãããç¹å®ã®ã¿ã€ãã®ãªããžã§ã¯ãã®ãµã€ãºãã¡ã¢ãªå ã®ã¢ã©ã€ã¡ã³ããå¯èœã§ãã
ä¹ãæã
åæåã¯ãä»®æ³åãšåçžæ§ã®ãã¬ãŒããªãã§ãã å®è¡æã«ã¯ã ãªãã·ã§ã³ãªãã®åçžã³ãŒãã¯1ã€ã ã㧠ãvirtualizedã¯äœã§ãããŸããŸããã ãªã¹ãããã®ã³ãŒãã¯ãªãã·ã§ã³ã®éããããªã¹ãã®ã©ãã§ãããããŸã ã éåžžãåæã®äœ¿çšã¯ã䜿çšãããªã¹ãã®ãªãã·ã§ã³ãå®çŸ©ããæŽæ°ã®ãã¿ã°ããæäœããããšã§ãã
ããšãã°ãåæã«ãã£ãŠå®è£ ãããå®è¡ãã¥ãŒã¯ããäœæãããå€æŽãããåé€ãã®3ã€ã®ã¿ã€ãã®å¯èœãªã¿ã¹ã¯ãå®çŸ©ã§ããŸãã ããšãã°ããäœæãã䜿çšããã«ã¯ããäœæãæ©èœã«å¯Ÿå¿ããã¿ã°ã§ããŒã¯ãããäœæçšã®ããŒã¿ããã¥ãŒã«éä¿¡ããã ãã§ãã ãã¥ãŒã¯ã¿ã°ãèªèããã¿ã°ããäœã欲ããã®ããããŒã¿ã«äœãããã®ãââãç解ãã察å¿ããã³ãŒããå®è¡ããŸãã
ä»®æ³åãšåæ§ã«ãåæã¯åãã³ãŒãã䜿çšããŠããŸããŸãªã¿ã€ãã®ããŒã¿ãç解ã§ããŸãããã³ããŒããå¿ èŠã¯ãããŸããã åçžæ§ã®ããã«ãå¯å€æ§ã®å¿ èŠã¯ãããŸãã-ã¿ã°ã®ã¿ãå€æŽãããŸãã ããã«ã転éã®æé©åã¯ã¯ããã«ç°¡åã§ãã
ãã ããå¯å€æ§ããŸã£ãã䜿çšãããªãå Žåãåæåã¯æ·±å»ã«æé·ããããšã«æ³šæããå¿ èŠããããŸããããã¯ãååãªããžã§ã¯ããåæå ã®æ倧åã®æ å ±ãæ ŒçŽããå¿ èŠãããããã§ãã ãåé€ãããã«ã¯ãååã ãã§ååã§ããããäœæãã¯ååãã¿ã€ããäœæè ãã³ã³ãã³ããªã©ãèŠæ±ããŸãããã¥ãŒãäž»ã«ãåé€ãã«äœ¿çšãããå Žåã§ããã¡ã¢ãªã«ãªããŸããæ°žç¶çãªãäœæãã®äž¡æ¹ãèŠæ±ããŸãã
ãã¡ãããæ©èœã®å šç¯å²ãäºåã«ç¥ãå¿ èŠããããŸããããã転éã®äž»ãªå¶éã§ãã åçžæ§ãšä»®æ³åã®äž¡æ¹ãå¿ èŠã«å¿ããŠãã€ã§ãæ¡åŒµã§ããŸãããåæã«ã€ããŠã¯èšããŸãã-ãã³ãã¬ãŒããæ°ããåã«éããããšãã§ããã¯ã©ã¹ãç¶æ¿ã§ããåæã¯æ¢ã«ã³ãŒãã§ãã£ãããšçŒãä»ããããŠããŸãã 欺ããŠæ¡å€§ããããšããè©Šã¿ã§ãããéžã°ãªãæ¹ãè¯ãã§ã-ããªãã¯ãã§ã«ããã䜿çšããŠãã人ã®ã³ãŒããç Žãå¯èœæ§ãé«ããªããŸãïŒ
ãããã£ãŠããã®æŠç¥ã¯éšåçã«ç解äžèœã§ãã å€ãã®èšèªã¯enumã®åœ¢åŒã§ãããæã£ãŠããŸãããåæå ã®ãªãã·ã§ã³ããšã«åå¥ã«ããŒã¿ãé¢é£ä»ããããšãã§ããªãããããã®äœ¿çšã¯éåžžã«å¶éãããŠããŸãã Cã§ã¯ããªãã·ã§ã³ã2ã€ã®ã¿ã€ãã®ã°ã«ãŒããšããŠå®çŸ©ã§ããŸãããåé¡ã®è§£æ±ºçã¯ããããã®ã¿ã€ãã®ããŒã¿ãšãåæã®ãŠãŒã¶ãŒã«èª²ãããã³ãŒãã§ãã å€ãã®é¢æ°åèšèªã«ã¯ãã¿ã°ã®ããã°ã«ãŒãïŒã¿ã°ä»ããŠããªã³ïŒããããŸããããã¯åæã®ãŠããªã³ã§ãããCã®ã°ã«ãŒãã«ãããä»»æã®ããŒã¿ãç°ãªãåæãªãã·ã§ã³ã«åºå®ã§ããŸãã
Rustã¯ã©ãã§ããïŒ
ãããã¯ããä»ã®èšèªã®å¯èœæ§ããªã¹ãããŸããããç§ãã¡ã®èšèªã§äœãã§ããŸããïŒ ãããŠãç§ãã¡ã®ãã®ã§ã¯ãã¹ãŠã3ã€ã®æ±ã«ããã£ãŠããŸãïŒ
- ãã¯ãïŒåçŽãªåçžïŒ
- åæïŒå®å šãããŒã¿ããïŒïŒ
- ç¹åŸŽïŒããã§ã¯æ¥œããã§ãããïŒ
ãã¯ã
ããã§ã¯ãã¹ãŠãç°¡åã§ãã ã³ãŒãã®ãããåå©çšã Rustã§ã¯ãã¡ã€ã³æ§æããªãŒïŒASTãæœè±¡æ§æããªãŒïŒã®æäžéšã§æ©èœããŸãããã¯ããæ§æããªãŒã«ãã£ãŒããããšãçµæã¯å¥ã®ããªãŒã«ãªããŸãã ãããŒãããã®è¡ã¯èª°ãã®ååã«äŒŒãŠããŸãããªã©ã®ã¿ã€ãã«é¢ããæ å ±ã¯ããã¯ãã«ã¯ãããŸããïŒ å®éã«ã¯å°ããããŸã -çŽãããïŒã
éåžžããã¯ãã¯2ã€ã®çç±ã§äœ¿çšãããŸããèšèªèªäœãæ¡åŒµããããæ¢åã®ã³ãŒãã®ã³ããŒãäœæããŸãã æåã®ãã®ã¯ãRustæšæºã©ã€ãã©ãªã®äžéšã®å Žæã§å ¬ç¶ãšäœ¿çšãããŠããŸã ïŒ printlnïŒã Thread_localïŒã VecïŒã Try ! ããã®ä»ãã¹ãŠïŒïŒ
/// `Vec`, . /// /// `vec!` `Vec`s . /// : /// /// - `Vec` : /// /// ``` /// let v = vec![1, 2, 3]; /// assert_eq!(v[0], 1); /// assert_eq!(v[1], 2); /// assert_eq!(v[2], 3); /// ``` /// /// - `Vec` : /// /// ``` /// let v = vec![1; 3]; /// assert_eq!(v, [1, 1, 1]); /// ``` /// /// - , /// `Clone`, , . /// /// `clone()` , /// `Clone`. , /// `vec![Rc::new(1); 5]` integer , /// . #[cfg(not(test))] #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] macro_rules! vec { ($elem:expr; $n:expr) => ( $crate::vec::from_elem($elem, $n) ); ($($x:expr),*) => ( <[_]>::into_vec($crate::boxed::Box::new([$($x),*])) ); ($($x:expr,)*) => (vec![$($x),*]) }
åŸè ã¯ãå€ãã®å埩çãªã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããããã«å éšçã«äœ¿çšãããŸãã
// // T -> T . // // macro_rules! impl_from { ($Small: ty, $Large: ty) => { impl From<$Small> for $Large { fn from(small: $Small) -> $Large { small as $Large } } } } // -> impl_from! { u8, u16 } impl_from! { u8, u32 } impl_from! { u8, u64 } // ...
ç§ã®èãã§ã¯ããã¯ãã¯ã³ãŒããåå©çšããææªã®æ¹æ³ã§ãã 圌ãã¯äœããã®åœ¢ã§åœ¹ç«ã€ã¯ãã§ãïŒå€æ°åã¯å éšã§äœ¿çšãããŠãããããã¯ããããªãŒã¯ããŸããïŒãããããã奜ã人ãããããããŸãïŒãã¯ãã§å®å šã§ãªããã®ã䜿çšãããšãå¥åŠãªå¯äœçšãçºçããŸãïŒã©ãã§ãããïŒ-çŽãã©ã³ã¹ïŒïŒã ãã¯ããã³ãã©ãŒã¯æ£èŠè¡šçŸã«åºã¥ããŠããïŒ exprãštt㮠解æãäºçŽ°ãªããšã§ã¯ãªããšããäºå®ã«ç®ãéããå ŽåïŒãäžè¬çã«ã誰ãæ£èŠè¡šçŸãèªãã®ã奜ãã§ã¯ãããŸããïŒ
ããã«éèŠãªããšã¯ãããã§ã®ãã¯ãã¯ãæ¬è³ªçã«åçåä»ãã«ããã¡ã¿ããã°ã©ãã³ã°ã§ãããšããããšã§ãã ã³ã³ãã€ã©ãŒã¯ããã¯ãæ¬äœããã®çœ²åãšäžèŽããããšããã§ãã¯ããããã¯ãã«åŸã£ãŠã³ãŒããçæããåºåã§äœããåãåãããã®åŸãã§ãã¯ããã ãã§ãå žåçãªåçããã°ã©ãã³ã°ã®åé¡-é 延ãšã©ãŒãã€ã³ãã£ã³ã°ã«ã€ãªãããŸãã ãããã£ãŠãRustã®ãäžå®ãã¯ãäžå®ãã¯é¢æ°ã§ã¯ãããŸãã ã
macro_rules! make_struct { (name: ident) => { struct name { field: u32, } } } make_struct! { Foo }
<anon>:10:16: 10:19 error: no rules expected the token `Foo` <anon>:10 make_struct! { Foo } ^~~ playpen: application terminated with error code 101
ãã®ééãã¯äœã§ããïŒ ãã¡ããããã¯ãã¯ååãå€æ°ãšããŠç解ããããªãã©ã«ãšããŠèªèããåžžã«è¿ãããã $ãå¿ããŸãã
struct name { field: u32 }
ïŒæ£çŽãªãšããããã¯ããã¯ãŒã«ã«æ±ãçç±ã¯-ããããããã§ããïŒ
ããã«ããã¯ãã«ãã£ãŠçæãããã³ãŒãã§å®æçãªãšã©ãŒãçºçããå Žåããã°ã«æ¶åã§ããªãæ··ä¹±ããããŸãã
use std::fs::File; fn main() { let x = try!(File::open("Hello")); }
<std macros>:5:8: 6:42 error: mismatched types: expected `()`, found `core::result::Result<_, _>` (expected (), found enum `core::result::Result`) [E0308] <std macros>:5 return $ crate:: result:: Result:: Err ( <std macros>:6 $ crate:: convert:: From:: from ( err ) ) } } ) <anon>:4:13: 4:38 note: in this expansion of try! (defined in <std macros>) <std macros>:5:8: 6:42 help: see the detailed explanation for E0308
ãããš...ããããä»ã®åçã«åä»ããããèšèªã®ããã«ãç§ãã¡ã®ãã©ã¹ã§ã¯ãåŒã®æè»æ§ãå€§å¹ ã«åäžããŠããŸãã èŠããã«ããã¯ãã¯ããã®äœ¿çšãæ£åœåãããé åã§çŸãããåã«...å£ããããããŸãã¯äœãã§ãã
èšåãã䟡å€ãããïŒæ§ææ¡åŒµãšã³ãŒãçæ
ãã¡ããããã¯ãã«ã¯å¶éããããŸãã ã³ã³ãã€ã«æã«ä»»æã®ã³ãŒããå®è¡ããŸããã ããã¯ã»ãã¥ãªãã£ãšé »ç¹ãªã¢ã»ã³ããªã«ã¯é©ããŠããŸãããéªéã«ãªãããšããããŸãã Rustã§ã¯ãããã2ã€ã®æ¹æ³ã§ä¿®æ£ã§ããŸãïŒæ§ææ¡åŒµïŒ æç¶ãåãã¯ã ïŒãšã³ãŒãçæïŒbuild.rsïŒïŒäžå®å®ãªèšèªãã©ã³ãã«ã¯ãŸã ã³ã³ãã€ã©ãã©ã°ã€ã³ããããŸã -ãããïŒã ãããã¯ãã¹ãŠãäœããçæããããã«äœããããããã®éä¿¡å·ãäžããŸãã
æ§ææ¡åŒµã¯ãã¯ããŸãã¯æ³šéã®ããã«èŠããŸãããã³ã³ãã€ã©ã«ä»»æã®ã¢ã¯ã·ã§ã³ãå®è¡ããŠæ§æããªãŒãïŒçæ³çã«ã¯ïŒå€æŽããããã«äŸé Œããæ©èœããããŸãã build.rsãã¡ã€ã«ã¯ ãããã±ãŒãžããã«ããããã³ã«ãã«ãããã³å®è¡ããå¿ èŠããããã®ãšããŠCargoããã±ãŒãžãããŒãžã£ãŒã«èªèãããŸãã æããã«ã圌ãã¯åãã§ãããžã§ã¯ãã«çŸ€ããããšãã§ããŸãã ã¢ã¯ã»ã¹ã§ããªããã¯ãçæã³ãŒãã«ã¯ããã䜿çšããæ¹ãè¯ããšäºæ³ãããŸãã
ããã€ãã®äŸãè¿œå ããããšãã§ããŸãããç¹ã«ãããã®æ©äŒã«ã€ããŠã¯ããã§ã¯ãªããç§ã¯ãããã«ãŸã£ããç¡é¢å¿ã§ãã ãŸãã³ãŒãçæã倧äžå€«ã ãããŠäžè¬çã«ãç§ã¯æ°æ¥éãã®èšäºãæžããŠããŠã 培åºçã«ç«ã¡åŸçããŠããŸã ïŒèè ãã£ããã¯åé€ãããŸãã-çŽPerãïŒã
ä¹ãæã
åè¿°ã®ã¿ã°ã䜿çšããæ£ç¢ºãªã°ã«ãŒãåã
OptionãšResultã«çŽé¢ããŠæãããèŠãããäœãã®æå/倱æã®çµæãè¡šããŸãã ã€ãŸãããããã¯æåéããæåããšããã¬ãŒã¯ããŠã³ããªãã·ã§ã³ã®åæã§ãã
ããªãèªèº«ã®è»¢éãæžãããšãã§ããŸãã ããã§ã¯ãããšãã°ã ipv4ããã³ipv6ã§åäœãããããã¯ãŒã¯ã³ãŒããå¿ èŠã§ã ã ä»®ã«ipv8ããµããŒãããå¿ èŠã¯çµ¶å¯Ÿã«ãããŸãããããšããããå¿ èŠã§ãã£ãŠããç¬ã¯ã³ãŒãã§ãããã©ããããããŸã ç¥ã£ãŠããŸãã ç§ãã¡ã¯æ£ç¢ºã«äœã®ããã®åæãæžããŠããŸãïŒ
enum IpAddress { V4(IPv4Address), V6(Ipv6Address), } fn connect(addr: IpAddress) { // , , match addr { V4(ip) => connect_v4(ip), V6(ip) => connect_v6(ip), } }
ããã ãã§ã ããã«ãäžè¬çãªã¿ã€ãã®IpAddressãæäœã§ããŸãããŸããå éšã®æ£ç¢ºãªã¿ã€ããç¥ãå¿ èŠãããå Žåã¯ã matchã䜿çšããŠäžèšã®æ¹æ³ã䜿çšããŠãã£ãã·ã³ã°ã¢ãŠãã§ããŸãã
ç¹æ§
ãããŸã§ã¯ããã¹ãŠãã·ã³ãã«ã§ããããä»ã§ã¯ããè€éã§èå³æ·±ããã®ã«ãªããŸãã
èŠããã«ãRustã®ç¹æ§ã¯ã ä»ã®ãã¹ãŠãèšè¿°ããããã«èšèšãããŠããŸã ã åçžåãä»®æ³åããªãã¬ã¯ã·ã§ã³ãæŒç®åã®ãªãŒããŒããŒããåå€æãã³ããŒã®ã»ãã³ãã£ã¯ã¹ãã¹ã¬ããã»ãŒããã£ãé«æ¬¡é¢æ°ãã«ãŒãã®ã€ãã¬ãŒã¿ãŒ-ãã®ã«ã©ãã«ãªããããã£ã³ã³ã¯ãã¹ãŠç¹æ§ãä»ããŠæ©èœããŸãã ããã«ããã¹ãŠã®æ°ãããŠãŒã¶ãŒèšèªæ©èœã¯ãã»ãšãã©ã®å Žåãç¹æ§ãéããŠå®è£ ãããŸãã
äžè¬çã«ãç¹æ§ã¯ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ããããæ¬åœã«ã
struct MyType { data: u32, } // , trait MyTrait { fn foo(&self) -> u32; } // impl MyTrait for MyType { fn foo(&self) -> u32 { self.data } } fn main() { let mine = MyType { data: 0 }; println!("{}", mine.foo()); }
å€ãã®å Žåãç¹æ§ãšã®éä¿¡ã¯JavaãŸãã¯CïŒã®ã€ã³ã¿ãŒãã§ãŒã¹ãšã®éä¿¡ãšéãã¯ãããŸããããå Žåã«ãã£ãŠã¯å¢çç·ãè¶ããå¿ èŠããããŸãã ç¹æ§ã¯ãã¢ãŒããã¯ãã£çã«æè»ã«èšèšãããŠããŸãã CïŒããã³Javaã§ã¯ã MyTypeã®ææè ã®ã¿ãMyTypeã«MyTraitãå®è£ ã§ããŸãã Rustã§ã¯ã ãã㯠MyTrait ã®ææè ã«ãèš±å¯ãããŠããŸãã ããã«ãããç¹æ§ã©ã€ãã©ãªã®äœæè ã¯ãæšæºã©ã€ãã©ãªã®åãªã©ã«å¯ŸããŠãå®è£ ãèšè¿°ã§ããŸãã
確ãã«ããã®ãããªæ©èœããã®ãŸãŸäœ¿çšããã®ã¯éåžžã«å°é£ã§ãã誰ããããã販売ããã«ã¯äžååã§ãã ãããã£ãŠããã®å¹žçŠã¯ãã¹ã³ãŒãå ã«å¯Ÿå¿ããç¹æ§ãæã€ã³ãŒãã®å®è£ ã®å¯èŠæ§ã«ãã£ãŠå¶éãããŸãã ãããã£ãŠãã¡ãªã¿ã«ã èªã¿åããšæžã蟌ã¿ãæ瀺çã«ã€ã³ããŒãããªããšãI / Oã®æäœã«é¢ãããã¹ãŠã®åé¡ãçºçããŸãã
ãããã¯ïŒäžè²«æ§
Haskellã«ç²ŸéããŠãã人ã¯ãåã¯ã©ã¹ãšå ±éããç¹åŸŽãå€ãèŠãããšãã§ããŸãã 圌ãã«ã¯å®å šã«æçœã§æ£åœãªè³ªåãããæš©å©ããããŸããå®éãåãã¿ã€ãã®åãç¹æ§ãç°ãªãå Žæã§æ°åå®è£ ãããšã©ããªããŸããïŒ äžè²«æ§ã®åé¡ãã€ãŸãã äžè²«ããäžçã§ã¯ãç¹æ§ã¿ã€ãã®å®è£ ã¯1ãã¢ã®ã¿ã§ãã ãŸããRustã§ã¯ãäžè²«æ§ãå®çŸããããã«ãHaskellãããå€ãã®å¶éããããŸãã å¶éã¯æ¬¡ã®ãšããã§ã-ããªãã¯ãç¹æ§ããŸãã¯ãããå®è£ ããåã®ããããã®ææè ã§ãªããã°ãªããŸããããŸãã埪ç°äŸåé¢ä¿ããã£ãŠã¯ãªããŸããã
impl Trait for Type
ããã¯çŸãããã·ã³ãã«ã§ç解ããããã§ããã次ã®ãããªãã®ãæãããšãã§ãããããå°ãééã£ãŠããŸãïŒ
impl Trait for Box<MyType>
TraitãšMyTypeãç©ççã«ã©ãã«ãããããããªããŠãã ãã®ãããªæäœã®æ£ããåŠçã¯ãäžè²«æ§ã®äž»ãªé£ããã§ãã ããã¯ããããã«ãã£ãŠèŠå¶ãããŠããŸã ããªãŒãã¡ã³ã«ãŒã«ãã§ã¯ãäŸåé¢ä¿ã®ãããã¯ãŒã¯å šäœã«å¯ŸããŠãç¹å®ã®ã¿ã€ãã®çµã¿åããã«å¯Ÿããç¹æ§ã®å®è£ ã1ã€ã®ã¯ã¬ãŒãã®ã¿ã«å«ãŸãããšããæ¡ä»¶ãå¿ èŠã§ãïŒçµã¿åããã«ã€ããŠã¯ã以äžãåç §-çŽãïŒã ãã®çµæãåæã«ã€ã³ããŒããããã競åããå®è£ ãå«ã2ã€ã®ç°ãªãã©ã€ãã©ãªã¯ãåã«ã³ã³ãã€ã«ãããŸããã ããã¯æã ããã³ã»ãã¿ãã¹ãèªç¶ã«åªãããããšæãã»ã©è¿·æã§ãïŒ ãã³ã»ãã¿ãã¹ ãRustã®äž»ãªã³ããã¿ãŒã®äžäºº-çŽããã ïŒã
ãããããã®ã¯ãæšæºã®Rustã©ã€ãã©ãªïŒããã€ãã®ã°ãã°ãã®éšåããå éšã«æ¥çãããŠããïŒã®äžæŽåãéåžžã«äžè¬çã§ãããããäžéšã®ç¹æ§ãå®è£ ãããã³åãäºæãã¬å Žæã«ããªãçŸããããšã§ãã åãã·ã£ããã«ããŠãããŸã圹ã«ç«ãããæŸèæïŒ[åºæ¬]ã«ãªã ãççŸã«ç®ãã€ã¶ãããã³ã³ãã€ã©ãŒã«æ瀺ããã®ã¯ããã«æ¥œããã§ãã
ãžã§ããªãã¯
ïŒç§ã¯ãããããäžè¬åãããåããšåŒã¶ã®ãæ£ããããšãç解ããŠããŸãããããã¯ç¬¬äžã«é·ãéããããŠç¬¬äºã«ã圌ãã¯ãŸã ããžã§ããªãã¯ããšããçšèªã䜿çšããŠããã®ã§ãããŸãæ確ã§ã¯ãããŸãã-çŽïŒ
ã§ã¯ãã©ã®ããã«ç¹æ§ã䜿çšããŠã³ãŒããåå©çšããŸããïŒ ããã§Rustãéžæè¢ãäžããŠãããŸãïŒ ç§ãã¡ã¯ã¢ãã¢ãŒãã£ã³ã°ã§ããä»®æ³åã§ããŸãã ã»ãšãã©ã®å Žåã®åçžæ§ã¯ãç§ãèŠãã»ãšãã©ã®ã³ãŒãã ãã§ãªããæšæºã©ã€ãã©ãªã§ãéžæã§ããŸãã ããã¯ãããããåçžæ§å šäœãããå¹ççã§ãããæããã«ããäžè¬åãããŠããããã§ãã ããã«ãããããããåçžã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ä»®æ³åã§ããŸããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
åçžã€ã³ã¿ãŒãã§ãŒã¹ã¯ããžã§ããªãã¯ã«ãã£ãŠRustã«å®è£ ãããŸãã
// , . struct Concrete { data: u32, } // . `<..>` . // `Generic` , // `Concrete`, `u32`. struct Generic<T> { data: T, } // impl Concrete { fn new(data: u32) -> Concrete { Concrete { data: data } } fn is_big(&self) -> bool { self.data > 120 } } // Foo. // , , , // // . // ( , - ..) impl Generic<u32> { fn is_big(&self) -> bool { self.data > 120 } } // T. // "impl" Generic. // , // , <T>. impl<T> Generic<T> { fn new(data: T) -> Generic<T> { Generic { data: data } } fn get(&self) -> &T { &self.data } } // . trait Clone { fn clone(&self) -> Self; } // . // . // , . // . trait Equal<T> { fn equal(&self, other: &T) -> bool; } // impl Clone for Concrete { fn clone(&self) -> Self { Concrete { data: self.data } } } // impl Equal<Concrete> for Concrete { fn equal(&self, other: &Concrete) -> bool { self.data == other.data } } // , , ! impl Clone for u32 { fn clone(&self) -> Self { *self } } impl Equal<u32> for u32 { fn equal(&self, other: &u32) -> Self { *self == *other } } // , ! impl Equal<i32> for u32 { fn equal(&self, other: &i32) -> Self { if *other < 0 { false } else { *self == *other as u32 } } } // impl<T: Equal<u32>> Equal<T> for Concrete { fn equal(&self, other: &T) -> bool { other.equal(&self.data) } } // // , , `T` // `Clone`! * * (trait bound). // ( , . - ..) impl<T: Clone> Clone for Generic<T> { fn clone(&self) -> Self { Generic { data: self.data.clone() } } } // . // - U. impl<T: Equal<U>, U> Equal<Generic<U>> for Generic<T> { fn equal(&self, other: &Generic<U>) -> bool { self.equal(&other.data) } } // , . impl Concrete { fn my_equal<T: Equal<u32>>(&self, other: &T) -> bool { other.equal(&self.data) } } impl<T> Generic<T> { // , : `equal` , // , . // (`x == y` `y == x`). , // `T: Equal<U>` ? // `T`, `U` ! // . fn my_equal<U: Equal<T>>(&self, other: &Generic<U>) -> bool { other.data.equal(&self.data) } }
ãµãã
ã芧ã®ãšãããã€ã³ã¿ãŒãã§ã€ã¹ãšãã®å®è£ ãå®çŸ©ããå¿ èŠãçãããããã«ãäžè¬æ§ã®ããŸããŸãªããªãšãŒã·ã§ã³ã«å¯ŸããŠå¹ åºãéžæè¢ããããŸãã ãããŠãã³ã³ãã€ã©ã®å éšã§ã¯ãç§ãèšã£ãããã«ãããã¯ãã¹ãŠå圢åããŸãã å°ãªããšãæåã®æé©åãŸã§ã次ã®äžéã³ãŒããååŸããŸãã
// struct Generic<T> { data: T } impl<T> Generic<T> { fn new(data: T) { Generic { data: data } } } fn main() { let thing1 = Generic::new(0u32); let thing2 = Generic::new(0i32); }
// struct Generic_u32 { data: u32 } impl Generic_u32 { fn new(data: u32) { Generic { data: data } } } struct Generic_i32 { data: i32 } impl Generic_i32 { fn new(data: i32) { Generic { data: data } } } fn main() { let thing1 = Generic_u32::new(0u32); let thing2 = Generic_i32::new(0i32); }
é©ããããããŸãããïŒé©ãããšããããŸãããïŒãããã€ãã®éèŠãªæ©èœã¯å€ãã®å Žæã«ã€ã³ã©ã€ã³åãããŠããŸãã ããšãã°ãbrsonã¯Servoã³ãŒãã§1700åãè¶ ãã Option :: mapã® ã³ããŒãèŠã€ããŸããã äžè¬ã«ãããããã¹ãŠã®åŒã³åºããä»®æ³åãããšãå®è¡æã®ããã©ãŒãã³ã¹ãå®å šã«äœäžããŸãã
ãŸãéèŠïŒåå®çŸ©ãšæŒç®åãã¿ãŒããã£ãã·ã¥ã
ïŒãturbofishããããããŸã翻蚳ããããšã¯ã§ããŸããããªãã·ã§ã³ã¯å€§æè¿ã§ã-çŽãïŒ
Rustã®ãžã§ããªãã¯ã¯ãåãèªåçã«æ€åºããŸãã ã¿ã€ããã©ããã«æå®ãããŠããå Žåããã¹ãŠãæèšã®ããã«æ©èœããŸãã æå®ãããŠããªãå Žåãè±ç«ãå§ãŸããŸãïŒ
// Vec::new() , // , . . // `Vec`, - . let mut x = Vec::new(); // `u8` `x`, `Vec<T>` x.push(0u8); x.push(10); x.push(20); // `collect` . , // `FromIterator`, Vec VecDeque. // - , // `collect` , `Vec::new()`, // // - . let y: Vec<u8> = x.clone().into_iter().collect(); // , // "-" `::<>`! let y = x.clone().into_iter().collect::<Vec<u8>>();
ç¹æ§ãªããžã§ã¯ã
ããã§ã¯ãããã§ä»®æ³åã¯ã©ããªã£ãŠããã®ã§ããããïŒ åã«é¡ã®ãªããäœããã«ãªãããã«ãç¹å®ã®ã¿ã€ãã«é¢ããæ å ±ãåé€ããã«ã¯ã©ãããã°ããã§ããïŒ Rustã®å Žåãããã¯ç¹æ§ãªããžã§ã¯ãã§çºçããŸãã ãã®åã€ã³ã¹ã¿ã³ã¹ã¯ç¹æ§ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããã³ã³ãã€ã©ãæ®ããè¡ããšèšãã ãã§ãã ãã¡ãããã€ã³ã¹ã¿ã³ã¹ã®ãµã€ãºãç¡èŠããå¿ èŠããããŸããããã¯ãïŒãïŒmutãBoxãRcãArcãªã©ã®ãã€ã³ã¿ãŒã®åŸãã«ãé ããŠããããã§ãã
trait Print { fn print(&self); } impl Print for i32 { fn print(&self) { println!("{}", self); } } impl Print for i64 { fn print(&self) { println!("{}", self); } } fn main() { // let x = 0i32; let y = 10i64; x.print(); // 0 y.print(); // 10 // Box<Print> - -, // , Print. Box<Print> // `Box<T: Print>`, -, `Box<Print>`. // `data` `Box<Print>`, // - ! // , i32 i64 , // . let data: [Box<Print>; 2] = [Box::new(20i32), Box::new(30i64)]; // . for val in &data { val.print(); // 20, 30 } }
ãã€ã³ã¿ã®åŸãã«ç¹å®ã®ã¿ã€ããé衚瀺ã«ãããšããèŠä»¶ã¯ãäžèŠæããã以äžã®çµæãããããããšã«æ³šæããŠãã ããã ããã«ãäŸãã°ãç§ãã¡ã®å€ãããªãã¿ã®ç¹åŸŽããããŸãïŒ
trait Clone { fn clone(&self) -> Self; }
ç¹æ§ã¯ã å€ã«ãã£ãŠç¬èªã®ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãé¢æ°ãå®çŸ©ããŸã ã
fn main() { let x: &Clone = ...; // - , let y = x.clone(); // , ...? }
ãããã yã®ããã«ã¹ã¿ãã¯äžã«ã©ã®ãããã®ã¹ããŒã¹ã確ä¿ããå¿ èŠããããŸããïŒ åœŒã¯ã©ããªã¿ã€ãã§ããïŒ
çãã¯ãã³ã³ãã€ã«æ®µéã§ã¯ãããããããªããšããããšã§ã ã ããã¯ã ã¯ããŒã³ã®ç¹æ§ãå®éã«ã¯ç¡æå³ã§ããããšã瀺åããŠããŸãã ããæ£ç¢ºã«ã¯ãå€ãšããŠã®ç¬èªã®åãžã®åç §ãå«ãŸããŠããå ŽåïŒããã³ãã€ã³ã¿ãŒã§ã¯ãªããçŽPerãïŒãç¹æ§ãç¹æ§ãªããžã§ã¯ãã«å€æããããšã¯ã§ããŸããã
ç¹æ§ãªããžã§ã¯ãã¯ãRustã§ããªãäºæ³å€ã®æ¹æ³ã§å®è£ ãããŸãã èŠããŠãããŠãã ãã-éåžžããã®ç®çã®ããã«ä»®æ³åãããé¢æ°ããŒãã«ã䜿çšãããŸãã ãã®æ¹æ³ã«ã¯ãå°ãªããšã2ã€ã®çç±ããããŸãã
ãŸããå¿ èŠããããã©ããã«é¢ä¿ãªãããã¹ãŠããã€ã³ã¿ãŒã®èåŸã«æ ŒçŽãããŸãã ã€ãŸããåãä»®æ³åå¯èœãšããŠå®çŸ©ãããŠããå Žåããã®åã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã®ãã€ã³ã¿ãŒãæ ŒçŽããå¿ èŠããããŸã ã
2ã€ç®ã¯ãä»®æ³ããŒãã«ããå¿ èŠãªé¢æ°ãååŸããããšã§ããã¿ã¹ã¯ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ããã¯ãã¹ãŠãã€ã³ã¿ãŒãã§ã€ã¹ãäžè¬ã«ãå€éç¶æ¿ã®ç¹æ®ãªã±ãŒã¹ã§ãããšããäºå®ã«ãããã®ã§ãïŒC ++ã§ã¯ãå€éç¶æ¿ã¯å®å šã§ãïŒã äŸãšããŠããããã®ã»ããã次ã«ç€ºããŸãã
trait Animal { } // trait Feline { } // trait Pet { } // // , , struct Cat { } // , struct Dog { } // , struct Tiger { }
Animal + PetãAnimal + Felineãªã©ãæ··ååã®å Žåã«é¢æ°ãã€ã³ã¿ãŒã®ã¹ãã¬ãŒãžãæŽçããæ¹æ³ã¯ïŒ åç©+ãããã¯ç«ãšç¬ã§æ§æãããŠããŸãã ãµã€ã³ã«åŸã£ãŠããããããªãã³ã°ããŸãã
ç«vtableç¬vtable Tiger vtable + ----------------- + + ----------------- + + ----------- ------ + | ã¿ã€ãã®ãã®| | ã¿ã€ãã®ãã®| | ã¿ã€ãã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | åç©ã®ãã®| | åç©ã®ãã®| | åç©ã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | ãããã®ãã®| | ãããã®ãã®| | ãã³ã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | ãã³ã®ãã®| + ----------------- +
ãããŠä»ãç«ãšèã¯ç°ãªã£ãŠããŸãã OKãããããšç«ã®ç«ãå ¥ãæ¿ããŸãããïŒ
ç«vtableç¬vtable Tiger vtable + ----------------- + + ----------------- + + ----------- ------ + | ã¿ã€ãã®ãã®| | ã¿ã€ãã®ãã®| | ã¿ã€ãã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | åç©ã®ãã®| | åç©ã®ãã®| | åç©ã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | ãã³ã®ãã®| | ãããã®ãã®| | ãã³ã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | ãããã®ãã®| + ----------------- +
ãããšãä»ã§ã¯ç«ãšç¬ã¯éããŸãã ãã®ããã«ãé¢æ°ã®ããŒã¯ã¢ãããå床貌ãä»ããŸãã
ç«vtableç¬vtable Tiger vtable + ----------------- + + ----------------- + + ----------- ------ + | ã¿ã€ãã®ãã®| | ã¿ã€ãã®ãã®| | ã¿ã€ãã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | åç©ã®ãã®| | åç©ã®ãã®| | åç©ã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | ãã³ã®ãã®| | | | ãã³ã®ãã®| + ----------------- + + ----------------- + + ----------- ------ + | ãããã®ãã®| | ãããã®ãã®| + ----------------- + + ----------------- +
ããã ããã ããã¹ã±ãŒãªã³ã°ããŸããã åä»®æ³é¢æ°ããŒãã«ã«çè«çã«å¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ãå«ããããšãã§ããããã«ãåã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ç¬èªã®ãã€ã¢ã¹ãå¿ èŠã§ããããšãããããŸãããããã¯ã åããŒãã«ããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããæ å ±ãäŸå€ãªãæ ŒçŽããå¿ èŠãããããšãæå³ããŸã ã¯ããããŒãã«ã®æåŸã§æªäœ¿çšã®ã¹ããŒã¹ãåãæšãŠãããšãã§ããŸãããããã¯å°ããªæ °ãã§ãããã¡ã¢ãªãç¡é§ã«ãªããããŸãã ãŸããåçã©ã€ãã©ãªããã€ã³ããŒããããã€ã³ã¿ãŒãã§ã€ã¹ã®ãªãã»ãããç¥ãããšã¯ã§ããŸããã ãããã£ãŠãã»ãšãã©ã®èšèªã§ã¯ãé¢æ°ããŒãã«ã¯å®è¡æã«ã®ã¿å®çŸ©ãããŸãã
ããããRustã¯ãããšã¯äœã®é¢ä¿ããããŸããã Rustã¯ãä»®æ³ããŒãã«ãåã«ä¿åããŸããã Rustã®ç¹æ§ãªããžã§ã¯ãã¯ãããããã·ãã¯ãã€ã³ã¿ãŒã§ãã ïŒPetã¯1ã€ã®ãã€ã³ã¿ãŒã§ã¯ãªããããŒã¿ãšä»®æ³ããŒãã«ãžã®2ã€ã®ãã€ã³ã¿ãŒã§ãã äžæ¹ãç¹æ§ãªããžã§ã¯ãã®ä»®æ³ããŒãã«ã¯ç¹å®ã®ã¿ã€ãã«é¢é£ä»ããããŠããŸããã ã¿ã€ãã®çµã¿åããããšã«åºæã§ãã
ç«ã®ãããvtableç¬ã®ãããvtable + ----------------- + + ----------------- + | ã¿ã€ãã®ãã®| | ã¿ã€ãã®ãã®| + ----------------- + + ----------------- + | ãããã®ãã®| | ãããã®ãã®| + ----------------- + + ----------------- +
åæ§ã«ãAnimal + PetãšAnimal + Felineã®ã»ããã«ã¯ç°ãªãããŒãã«ããããŸããã€ãŸããé¢æ°ããŒãã«ã¯åã®äžæã®ã»ããããšã«å圢åãããŸãã
ãã®ã¢ãããŒãã¯ãä»®æ³é¢æ°ããŒãã«ãæ§ç¯ããåé¡ãå®å šã«æé€ããŸããä»®æ³åã«é¢äžããªãå€ã¯è¿œå ã®ããŒã¿ãä¿åãããPetãå®è£ ããä»»æã®ã¿ã€ãã§ã 1ã€ãŸãã¯å¥ã®Peté¢æ°ãã©ãã«ããããéçã«æ±ºå®ã§ããŸãã
ãã®æ¹æ³ã®æ¬ ç¹ããããŸãã倪ããã€ã³ã¿ãŒã¯2åã®ã¹ããŒã¹ãå æããããããã€ã³ã¿ãŒãå€ããšåé¡ã«ãªããŸãããŸããèŠæ±ãããã¿ã€ãã®çµã¿åããããšã«é¢æ°ããŒãã«ãå圢åããŸãããããã¯ãããç¹å®ã®æç¹ã§åãªããžã§ã¯ãã®ã¿ã€ããéçã«æ€åºã§ãããšããäºå®ãšãåæ§ã«ç¹æ§ãªããžã§ã¯ãã®ãã¹ãŠã®çž®å°ã«ããå¯èœã§ããããã§åçžåãä»®æ³åã«çœ®ãæãããšãããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸããïŒãŸãããããã£ãŠãèšèªã¯åããã£ã¹ãããèœåãéåžžã«éãããŠããŸã-çŽperãïŒã
泚æïŒé害ãèŠã€ããæ©äŒïŒ
倪ããã€ã³ã¿ãŒã¯ãååãšããŠã倪ããã€ã³ã¿ãŒã«ããã«äžè¬åã§ããŸãã ã倪ããã€ã³ã¿ãŒããšããŠãAnimal + Felineã¿ã€ãã¯1ã€ã®å ±éä»®æ³ããŒãã«ãæããŸããããã®ããŒãã«ãåç¹æ§ããšã«å¥ã ã«2ã€ã«åå²ããªãçç±ã¯ãããŸãããçè«çã«ã¯ãããã«ããããã€ã³ã¿ãŒãããã«å€ªããªããããããŒãã«ã®åçžæ§ãå¶éãããå¯èœæ§ããããŸãããã®ã¢ã€ãã¢ã¯å®æçã«æµ®äžããŸããã誰ãçå£ã«åãæ¢ããŸããã
æåŸã«ããŠãŒã¶ãŒãåçžã€ã³ã¿ãŒãã§ãŒã¹ãä»®æ³åã§ãããšããæè¿ã®å£°æãæãåºããŠãã ãããããã¯ãããã¬ã€ãã®å®è£ ãã¬ã€ããïŒãã¬ã€ãã®ã€ã³ãã¬ã€ããã¬ã€ãïŒããŸãã¯ããã-ãã¬ã€ããªããžã§ã¯ããç¬èªã®ãã¬ã€ããå®è£ ããããšã§å¯èœã«ãªããŸããïŒIMHOåã·ã¹ãã ã®æãã¯ãŒã«ãªæ©èœ-çŽPerãïŒãçµæãšããŠããã®ã³ãŒãã¯æå¹ã§ãã
// ... trait Print { fn print(&self); } impl Print for i32 { fn print(&self) { println!("{}", self); } } impl Print for i64 { fn print(&self) { println!("{}", self); } } // ?Sized , T (&, Box, Rc, ). // Sized ( ) - , . // Traits [T] " ". // `T: ?Sized`, // T , , // Sized . fn print_it_twice<T: ?Sized + Print>(to_print: &T) { to_print.print(); to_print.print(); } fn main() { // : . print_it_twice(&0i32); // 0, 0 print_it_twice(&10i64); // 10, 10 // i32::Print i64::Print. let data: [Box<Print>; 2] = [Box::new(20i32), Box::new(30i64)]; for val in &data { // : . // &Box<Print> &Print , // - ... print_it_twice(&**val); // 20, 20, 30, 30 } }
ãã£ããããå®ç§ã§ã¯ãããŸãããã楜ããã§ããæ®å¿µãªãããBox <Trait>ã®impl Traitã¯ãããŸãããBox <T>ã®impl <TïŒTrait> TraitãšããŸãçžäºäœçšããªãããã§ããããŸã æãäžããŠããŸããããã¶ããããã¯ååã ãããã®äºå®Tæã ãµã€ãºã®ïŒ
é¢é£ããã¿ã€ã
ããã¿ã€ãã«ãã£ãŠäžè¬åãããäœããå®çŸ©ãããšããäºå®ã®çµæã¯ã©ããªããŸããïŒãããŠãããã§äœãè¡šçŸãããã®ã§ããããïŒå®éã«ã¯ãè¡šçŸãšçµæã®äž¡æ¹ã1ã€ã§ãããããç§ãã¡ãå ¥ã蟌ãã åãã©ã®ããã«æ±ããã決å®ãããã®ã§ããå®éããã®ã¿ã€ãã¯å ¥åãã©ã¡ãŒã¿ãŒã§ããstruct Foo <T>ã¯ãFooãšTããæ¬æ Œçãªåã®ã¿ãçµã¿ç«ãŠãããšãã§ãããšèšã£ãŠããŸããFooèªäœã¯äžå®å šã§ããç¹å¥ãªçšèªã«æ ç±ãããå Žåãåã³ã³ã¹ãã©ã¯ã¿ãŒã§ããFoo ã¯ãåãåŒæ°ãšããŠåãåããçµæãšããŠåãè¿ãé¢æ°ã§ãããšèšããŸããã€ãŸããé«æ¬¡ã®ã¿ã€ãã§ãã
次ãtrait Eat <T>ããŸãã¯äžè¬åãããtrait Eat-圌ã¯åœŒèªèº«ã«ã€ããŠäœãæããŠãããŸããïŒå°ãªããšããè€æ°åå®è£ ã§ããŸãããããŠããã®å®çŸã®ããããã®ããã«å¿µé ã«çœ®ããŠããµãŒãããŒãã£ã®ã¿ã€ãã®äžçš®ã§è² æ ããããšãå¿ èŠã§ããTããããé£ã¹ãäžå®å šããããã£ãŠãEatãã©ããã§å®è£ ãããŠãããšèšãããšã¯äžå¯èœã§ãããšããçµè«ã¯ãEat <T>ã®ã¿å®è£ å¯èœã§ãããããã§Tã¯ãŠãŒã¶ãŒã«ãã£ãŠæ±ºå®ãããŸãã
ããŠãOKãç§ãã¡ã¯ãããšäœãããªããã°ãªããŸãããïŒããã¯ãå埩åã®äŸã§ç€ºãããšãã§ããŸãã
trait Iterator<T> { fn next(&mut self) -> Option<T>; } /// , , struct StackIter<T> { data: Vec<T>, } // [min, max) struct RangeIter { min: u32, max: u32, } impl<T> Iterator<T> for StackIter<T> { fn next(&mut self) -> Option<T> { self.data.pop() } } impl Iterator<u32> for RangeIter { fn next(&mut self) -> Option<u32> { if self.min >= self.max { None } else { let res = Some(self.min); self.min += 1; res } } }
ãããŸã§ã®ãšããè¯ããã€ã³ã¿ãŒãã§ã€ã¹ã®äžè¬çãªå®è£ ãšãã©ã€ããŒããªå®è£ ã®äž¡æ¹ãèšè¿°ã§ããŸãããããŠå¥è·¡ãèµ·ãã£ã-åå®æ°åã¯Iteratorã äžåºŠããå®è£ ã§ããªãã StackIter <Cat>ã¯Iterator <Cat>ã®ã¿ãå®è£ ããIterator <Dog>ãå®è£ ããå¿ èŠã¯ãããŸãããå®éã圌ã¯ä»ã®äœããå®è£ ããããšãèš±å¯ãããŠããŸãããããããªããšãå®è£ ãããã¿ã€ãã®Iterator :: nextïŒïŒãè¿ããããªããžã§ã¯ãã«ãŠãŒã¶ãŒã¯å°æããŸãã
ããã§ãæã ã¯ãããéåžžã«åãã§ããTã¯ãå ¥åã¿ã€ããšããŠã€ãã¬ãŒã¿ãããã¯å ¥åãšåãã¿ã€ãã - Tã®ããã®StackIterãããã§ãããŠãŒã¶ãŒãšããŠã¯Iterator :: nextïŒïŒã«ãã£ãŠè¿ãããåãããŒãã³ãŒãã£ã³ã°ã§ããªããããããããã®è±åºã¯ãããŸããããã®æ å ±ã¯ãå埩åãå®è£ ããåãæäŸããããã«å¿ èŠã§ãïŒ
ããŸã楜ãããªããã®ç¬éã«ãé¢é£ããåã«ç²Ÿéããæãæ¥ãŸããã
é¢é£ä»ããããåã«ãããç¹æ§ã®å®è£ ãç¹å®ã®å®è£ ã«é¢é£ä»ããããè¿œå ã®åã瀺ãå¿ èŠãããããšã瀺ãããšãã§ããŸããã€ãŸããç¹æ§ã¯ç¹å®ã®é¢æ°ãšåãæ¹æ³ã§ç¹å®ã®ã¿ã€ããå¿ èŠãšãããšããããšã§ããé©åã«åäœæãããIteratorã次ã«ç€ºããŸãã
trait Iterator { // , // type Item; fn next(&mut self) -> Option<Self::Item>; } /// , , struct StackIter<T> { data: Vec<T>, } // [min, max) struct RangeIter { min: u32, max: u32, } impl<T> Iterator for StackIter<T> { // // - type Item = T; fn next(&mut self) -> Option<Self::Item> { self.data.pop() } } impl Iterator for RangeIter { // type Item = u32; fn next(&mut self) -> Option<Self::Item> { if self.min >= self.max { None } else { let res = Some(self.min); self.min += 1; res } } }
ãããŠãIteratorãæ°åå®è£ ããããšã¯ã§ããŸãããé¢é£ä»ããããã¿ã€ãã¯äžè¬åã§ããŸããã次ã®ãããªä»ã®ã¿ã€ããšã¯å¥ã«å®çŸ©ããããšã¯ã§ããŸããã
impl<T> Iterator for RangeIter { type Item = T; fn next(&mut self) -> Option<Self::Item> { unimplemented!() } }
<anon>:3:6: 3:7 error: the type parameter `T` is not constrained by the impl trait, self type, or predicates [E0207] <anon>:3 impl<T> Iterator for RangeIter { ^
ãããã£ãŠãé¢é£ä»ããããåã¯åœç¶çºä¿¡åãšåŒã°ããŸãã
ããã§ãç¹æ§ã®å®è£ ãé¢é£ããåã«éå®ããŸããããããã¯ä»ã«äœãäžããŸããïŒããã§ã以åã¯ã¢ã¯ã»ã¹ã§ããªãã£ãããã®ãããªããšãè¡šçŸã§ããŸããïŒ
ãããŠïŒ
ã¹ããŒããã·ã³ã¯æ¬¡ã®ãšããã§ãïŒãããã«èª¿æŽãããå埩åïŒã
trait StateMachine { type NextState: StateMachine; fn step(self) -> Option<Self::NextState>; }
ãããã£ãŠãããã¯åã§ããããã®ã€ã³ã¹ã¿ã³ã¹ã¯stepïŒïŒãå®è¡ããããã«èŠæ±ã§ãããã®çµæã¯åãåã®å¥ã®ã€ã³ã¹ã¿ã³ã¹ã«å€æãããŸãããžã§ããªãã¯ã§è¡šçŸããŸã...ïŒ
trait StateMachine<NextStep: StateMachine<_____>> { fn step(self) -> Option<NextState>; }
...ãããŠãåãã§åã®ç¡éååž°ãååŸããŸãããžã§ããªãã¯ã®ãžã§ããªãã¯ã¿ã€ãã¯incomingã§ããããããã¬ã€ãã®ãŠãŒã¶ãŒã決å®ããå¿ èŠããããŸãããã®å Žåããã®ã¿ã€ãã¯ç¹æ§ãã®ãã®ã§ããããã«ãããããããé¢é£ããã¿ã€ãããªããŠãå®è¡ã§ããŸã-ä»®æ³åããããŸãïŒ
trait StateMachine { // Box ! self Box<Self>. // Rc<Self> , *Box *. // ( , - ..) fn step(self: Box<Self>) -> Option<Box<StateMachine>>; }
ããã§ã¯ãé¢é£ããã¿ã€ããªãã§ã®ã¿ãå€ãç¶æ ãã·ã³ãæç»ããŸãããå ã®ã€ã³ã¹ã¿ã³ã¹ãåžåããŸãïŒèªå·±ã¯åçšãããŸãããã€ãŸããã¹ãããïŒïŒã®å®äºåŸãããã䜿çšããããšã¯ã§ããªããªããŸã-çŽPerãïŒãåºåã§ã¯ãã¹ããŒããã·ã³ãå®è£ ããäœããååŸããŸãããã ãããããæ©èœããããã«ã¯ããã¹ãŠã®ã¹ããŒããã·ã³ã®äœ¿çšãããŒãäžã®å®è£ ã®ã¿ã«å¶éããå¿ èŠããããŸãããŸããstepïŒïŒã®æåã®åŒã³åºãåŸã«ç¹å®ã®ã¿ã€ãã®ãã·ã³ã«é¢ããæ å ±ã倱ãããŸããé£æ³åã§ã¯ã1çªç®ã2çªç®ãçºçããŸããã
ãããŠããã1ã€ãããŸããç¹æ§ãªããžã§ã¯ãã¯ãé¢é£ããåã§ã¯æ©èœããŸããã圌ããå€ã«ããèªå·±ã§åäœããªãåãçç±ã§ãå ·äœçãªå®è£ ã¿ã€ãã¯äžæã§ããåéã«ããæ¹æ³ã¯ãç¹å®ã®ã¿ã€ãããã¹ãŠæå®ããããšã§ããBox <Iterator>ã¯å®£èªããBox <Iterator <Item = u32 >>ã¯éåžžã«ããŸãèµ·åããŸãã
ã©ãæ¡ä»¶
å€ãäŸïŒ
impl<T> Generic<T> { // , : `equal` , // , . // (`x == y` `y == x`). , // `T: Equal<U>` ? // `T`, `U` ! // . fn my_equal<U: Equal<T>>(&self, other: &Generic<U>) -> bool { other.data.equal(&self.data) } }
ããã§ãåãé¢é£ä»ããæ¹æ³ãããããŸãããããã¯ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
// : // " ", // , Item! fn min<I: Iterator<Item = T>, T: Ord>(mut iter: I) -> Option<I::Item> { if let Some(first) = iter.next() { let mut min = first; for x in iter { if x < min { min = x; } } Some(min) } else { None } }
ãããŠãããã«è§£æ±ºçããããŸã-ãã©ããæ¡ä»¶ã
impl<T> Generic<T> { fn my_equal<U>(&self, other: &Generic<U>) -> bool where T: Equal<U> { self.data.equal(&other.data) } } fn min<I>(mut iter: I) -> Option<I::Item> where I: Iterator, I::Item: Ord, { if let Some(first) = iter.next() { let mut min = first; for x in iter { if x < min { min = x; } } Some(min) } else { None } }
ã©ãã§ç¹æ§ãä»»æã®åã«å¶éã§ããŸããå€ããå°ãªãããããã¯ã眲åã§åãã€ã³ã©ã€ã³åãããããæè»æ§ããããŸããã©ãã«ããªããç¹è²ãç¹æ§ã®å®çŸ©ãé¢æ°ãæ§é äœãåæåã®å®è£ ã«åºå·ããããšãã§ããŸã-倧ãŸãã«èšãã°ãã©ããžã§ããªãã¯åããããŸãã
ãŸããããã€ãã®å®çŸ©ã¯ãè³ãäœãããã®åããšéœæ°ã«ãªãããšãããïŒèªã¿åãã誰ãã<T>ã©ãMyReferenceçšã«éä¿¡IMPL ïŒTïŒéä¿¡åããŠïŒãããŠããã«æ¥œãããªããŸãã - prim.perïŒïŒãããã©ã圢質ãšã®çžäºäœçš-ãªããžã§ã¯ãã«ã¯ããã€ãã®ç¹æ®å¹æã䌎ããŸããå€ã«ãã£ãŠèªåèªèº«ãåç §ããããšãæå³ããç¹æ§ã¯ãç¹æ§ãªããžã§ã¯ãã§ã¯äœ¿çšã§ããªãããšãèŠããŠããŸããïŒèŠããã«ãç¹æ®å¹æã¯ãããä¿®æ£ã§ããŸãïŒ
trait Print { fn print(&self); // `where Self: Sized` , // - . , // Print -! fn copy(&self) -> Self where Self: Sized; } impl Print for u32 { fn print(&self) { println!("{}", self); } fn copy(&self) -> Self { *self } } fn main() { let x: Box<Print> = Box::new(0u32); x.print(); }
é«æ¬¡ç¹æ§ã®å¶é
ãã®æç¹ã§å±æ ¹ããŸã ãªããªã£ãŠããªãå Žåã¯ã次ã®ã»ã¯ã·ã§ã³ã§ã¯å±æ ¹ãéããªãã®ã§ã幞éã§ããççŽã«èšã£ãŠæ³¥ã ããã®æ²Œå°ãçºçããããã§èª¬æãããŸãããå·åã·ã¹ãã ã®æªåé«ãçä¿¡è ã ãããããã³ã°ã楜ããããšãã§ããŸãã
次ã«ãé«æ©èœã®é¢æ°ãäœæããŸãããããã®é¢æ°ã¯ããé¢æ°ã§æ©èœããé¢æ°ãã§ããçŸããæåãªäŸã¯mapïŒïŒã§ãïŒ
let x: Option<u32> = Some(0); let y: Option<bool> = x.map(|v| v > 5);
5æ¯ã®ã³ãŒããŒãæ»ããšãRustãç¹æ§ãä»ããŠè¡ãæ§ãããªã³ã¡ã³ãã«åºããããããããŸããã ããããããããçŽ æŽãããç¹æ§ã ãããã ã£ãããšããªãã¯èšããããã«ããããããã¯ãã ã®ç¹æ§ã ïŒãããã«ãããŸãïŒFnãFnMutããã³FnOnceãä»ãç§ãã¡ã«ãšã£ãŠãããã®éãã¯åãã«è¶³ããªããã®ã§ãããç§ãã¡ã¯åœŒããããç§ãã¡ã説æããããã®ã«ãã£ãšçŸããããã£ãŠãããã®ãåãäžããŸãã
Fnã¯å®éã«ã¯ç¹æ§ã§ã¯ãªããç¹æ§ã®ãã¡ããªãŒã§ããFnïŒAãBïŒ-> Cã¯ããã§ã«ç¹æ§ã§ãããžã§ããªãã¯ã®ãããªãã®ãããã§ãã£ãŠãïŒããã¯äžè¬çãªãã®ã§ããFnïŒAãBïŒ-> C-çŽæ¥å©çšã§ããªãäžè¬åãããç¹æ§ã®äžã«ããæ§æç³ïŒå°ãªããšãããŒãžã§ã³1.7ã®å ŽåïŒãã³ã³ãã€ã©ã¯ãããå±éããŸãFN <ïŒAãBïŒãCåºå=> ãçä¿¡ã¿ã€ããçºä¿¡ã¿ã€ãã¯æ確ã«è¡šç€ºããããã¹ãŠãç§ãã¡ã®èšããšããã§ãïŒ
ããã«åºã¥ããŠãmapïŒïŒã®äŸã®ã¯ããŒãžã£ã¯FnOnceïŒu32ïŒ-> boolãå®è£ ããŸãããããŸã§ã®ãšããããŸã£ããæããªãããããŸã§ã
fn get_first(input: &(u32, i32)) -> &u32 { &input.0 } fn main() { let a = (0, 1); let b = (2, 3); let x = Some(&a); let y = Some(&b); println!("{}", x.map(get_first).unwrap()); println!("{}", y.map(get_first).unwrap()); }
å®éã«ã©ã®get_firstç¹æ§ãããã«å®è£ ãããŠããŸããïŒåæ§ã«>ïŒU32 -ã®FnïŒïŒïŒU32ãI32ïŒïŒ ïŒ2è¡ç®ã
trait MyFn<Input> { type Output; } // -; // , . struct Thunk; impl MyFn<&(u32, i32)> for Thunk { type Output = &u32; }
<anon>:9:11: 9:22 error: missing lifetime specifier [E0106] <anon>:9 impl MyFn<&(u32, i32)> for Thunk { ^~~~~~~~~~~ <anon>:9:11: 9:22 help: see the detailed explanation for E0106 <anon>:10:19: 10:23 error: missing lifetime specifier [E0106] <anon>:10 type Output = &u32; ^~~~ <anon>:10:19: 10:23 help: see the detailed explanation for E0106 error: aborting due to 2 previous errors
ç涯ã®ãªãåçšã¯çŽç²ãªåç·šã§ããéåïŒåå ¥ãã¿ã€ãã®äžéšã§ããå Žå-ã©ã€ãã¿ã€ã ãé©çšããŠãã ããïŒãã1ã€ã¯ãRustã¯99ïŒ ã®ã±ãŒã¹ã§ãã®ã«ãŒã«ã«è² æ ããããªãã»ã©è³¢æã§ãããšããããšã§ããããã©ã«ãã®ã©ã€ãã¿ã€ã ã眮ãæããã ãã§ãïŒéèªçã«ç¿»èš³ããã®ã«ããŸãæå³ã®ãªãå¥ã®çšèªã§ã誰ããããã䜿çšããŸã-ãããPerãïŒãå®éã®ãšãã
ãget_firstãå®éã«ãã®ãããªã¢ã³ã¹ã¿ãŒããããŸãïŒ
fn get_first<'a>(input: &'a (u32, i32)) -> &'a u32 { &input.0 }
å¥ã®ã«ãŒã«ïŒé¢æ°ã®çœ²åãåçšãããšãé¢æ°ã¯ãããã«é¢ããŠäžè¬åãããŸãããããã£ãŠãäžè¬åãããç¹æ§ãå®è£ ããå¿ èŠããããŸãã
trait MyFn<Input> { type Output; } struct Thunk; impl<'a> MyFn<&'a (u32, i32)> for Thunk { type Output = &'a u32; }
ã³ã³ãã€ã«ããŸãããããŠä»ãç§ã¯ããªãã«å察ãèšããŸãïŒç§ãã¡ãå¿ èŠãšããç¹æ§ã¯FnïŒïŒïŒu32ãi32ïŒïŒ->ïŒu32ã§ããããã«ãç§ã¯ããªãã«åãã€ãããæ¹æ³ãšçç±ãã€ãã¬ãŒã¿ãŒã®ãã£ã«ã¿ãŒã®äŸã瀺ããŸãã
/// struct Filter<I, F> { iter: I, pred: F, } /// fn filter<I, F>(iter: I, pred: F) -> Filter<I, F> { Filter { iter: iter, pred: pred } } impl<I, F> Iterator for Filter<I, F> where I: Iterator, F: Fn(&I::Item) -> bool, // ! - ! ? { type Item = I::Item; fn next(&mut self) -> Option<I::Item> { while let Some(val) = self.iter.next() { if (self.pred)(&val) { return Some(val); } } None } } fn main() { let x = vec![1, 2, 3, 4, 5]; for v in filter(x.into_iter(), |v: &i32| *v % 2 == 0) { println!("{}", v); // 2, 4 } }
èŠç¥ãã¬äººãšå¥åŠãªãlifetime ïŒval ãæ±ãã«ã¯predïŒïŒãå¿ èŠã§ããæ®å¿µãªãããwhere ïŒïŒæ¡ä»¶ãnextïŒïŒã«æããŠãããã®ã©ã€ãã¿ã€ã ãæ瀺çã«æå®ããããšã¯ã§ããŸããïŒäžè¬çã«ãIteratorã¯ãããèš±å¯ããŸããïŒããã®ã©ã€ãã¿ã€ã ã¯ãé¢æ°å ã§åã«è¡šç€ºããã³é衚瀺ã«ãªããéžæãååã®æå®ãã§ããŸããããŸããååãåŒã³åºããªã人ãšäœæ¥ããã«ã¯predïŒïŒãå¿ èŠã§ãïŒç§ãã¡ã¯é¡ã«ç»ããŸã- 人çã®ãã¹ãŠã®æéã§åãããã«predïŒïŒãå¿ èŠã§ããçªç¶ïŒ
F: Fn(&I::Item) -> bool
ããã¯ç ç³ã§ã
for<'a> F: Fn(&'a I::Item) -> bool
ã€ãŸãã<'a>ã¯ã»ãšãã©éèªçã«èªãŸããŸãïŒfor all' aïŒfor all 'aïŒïŒ
ã¬ããã»ã³ãŒã«ãã®å¶çŽé«æ¬¡ã®ç¹æ§ïŒïŒHRTBïŒãã€ã³ãäžäœç¹æ§ ïŒãè€éãªåæ§é ãæã€ããçš®ã®æ²Œå°ã«æ¢ã«åžã蟌ãŸããŠããªãéããããããæäœããå¿ èŠã¯ãããŸãããéåžžãHTRBã¯æ©èœç¹æ§ãæäœãããšãã«è¡šç€ºãããããã§ãæ§æç³ã§èŠãããŠããŸããã€ãŸããå€ãã®å ŽåããŠãŒã¶ãŒã«å¯ŸããŠééçã§ããçŸæç¹ã§ã¯ãé«æ¬¡ç¹æ§ã®å¶éã¯æå¹æéã§ã®ã¿æ©èœããŸãã
é«æ¬¡ã¿ã€ã
ãžã§ããªãã¯ã¯æ¬è³ªçã«é«æ¬¡ã®åãè¡šçŸããæ¹æ³ã§ããããšã¯æ¢ã«è¿°ã¹ãŸãããVecã¯ïŒTïŒ-> Vec <T>ãšãã圢åŒã®åã³ã³ã¹ãã©ã¯ã¿ãŒãšèããããšãã§ããŸããimpl <T> Vec <T>ã®TraitãŸãã¯fn make_vec <T>ïŒïŒ-> Vec <T>ã®ãããªæ±çšã³ãŒããèšè¿°ãããšãã«ããã®åã³ã³ã¹ãã©ã¯ã¿ãŒãæå³ã§ããŸãããŸããå¶éã«ã€ããŠãèŠããŠããŸã-åã³ã³ã¹ãã©ã¯ã¿ãŒã«ã€ããŠèšãã°ããã®çºä¿¡åã瀺ã矩åããããŸããã€ãŸããã³ã³ã¹ãã©ã¯ã¿èªäœãäžè¬åããããšã¯ã§ããŸããã
ããšãã°ãåç §ã«ãŠã³ããã€ã³ã¿ãŒã䜿çšããããŒã¿æ§é ãå¿ èŠã§ãã Rustã«ã¯ãRcãšArcã® 2ã€ã®ãªãã·ã§ã³ããããŸããRcçç£çãArcã¯ã¹ã¬ããã»ãŒãã§ããæ§é ã®å®è£ ã®èŠ³ç¹ããããããã®åã¯å®å šã«äº€æå¯èœã§ãããšä»®å®ããŸãããã ããæ§é äœã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯ãã©ã®ãã€ã³ã¿ãŒã«ãŠã³ã¿ãŒã䜿çšããããéåžžã«éèŠã§ãã
ãã¡ãããRcãšArcã«é¢ããŠæ§é ãäžè¬åããå¿ èŠããããŸããçæ³çã«ã¯ã次ã®ããã«æžããŸãã
// , . ! /// . /// RefCount Rc Arc, . struct Node<RefCount: RcLike, T> { elem: T, next: Option<RefCount<Node<RefCount, T>>>, }
ãããŒãããã¯ã§ããŸããïŒãŠãŒã¶ãŒã¯ããã§RcãŸãã¯Arcãéä¿¡ã§ããªããããããã¯ããããŸãããåã¯äžè¬åãããŠãããRc <SomeType>ã®ããã«ãååŒæ°ãã¹ãªããããããšã«ããå®æããå¿ èŠããããŸããã»ããRc <Node <T >>ã®ç¹æ§ãèãåºãããšãã§ããŸãããããã¯RcãšArcãçŽæ¥æäœãããããæ¶åããã«ããã§ããããã¯ãããŒã³ãè¿ããžã§ããªãã¯ã§ã次ã®ããã«äœ¿çšã§ããŸãã
/// , `next` , /// . trait RefIterator { type Item; fn next(&mut self) -> &mut T }
æ¢ã«ç¥ã£ãŠããããã«ãããã¯ãã ã®ç ç³ã§ã
trait RefIterator { type Item; fn next<'a>(&'a mut self) -> &'a mut Self::Item; }
ããã§åä»ãªç¹ã¯ãåçšããåããå€éšã«çªãåºã極端ãªãªããžã§ã¯ããšããŠããŒãã³ãŒãã£ã³ã°ãããšããäºå®ã§ããã€ãŸããSelf :: Itemãã©ããã«æ ŒçŽããå¿ èŠããããŸããåãã§ãã®ããŒã³ãæããŠãã®åé¡ã解決ããŸãã
trait RefIterator { type Item; fn next<'a>(&'a mut self) -> Self::Item<'a>; }
Self :: Item =ïŒmut Tãæžãããšãã§ããçè«çã«ã¯æºè¶³ããŠãããããããã«çŸãããäžè¬åãããŠããããã«èŠããŸããItemãéãã«åã³ã³ã¹ãã©ã¯ã¿ãŒã«å€ãããäžè¬åã§ããªãããšã«æ°ä»ããŸã§ïŒ
ã³ã³ãã€ã©ãŒã«ããå°ããã°ãã§ããŸããããããç§ã¯ããªãã«ãããäŒããŸããã§ããã
ããã§ã®éèŠãªç¥èã¯ãç¹æ§ã«ã¯å ¥åã¿ã€ããšåºåã¿ã€ããããããšãç解ããããšã§ããã€ãŸããç¹æ§ã¯ã¿ã€ãã®äžã«ããé¢æ°ã§ãããããèŠãŠãã ããïŒ
trait TypeToType<Input> { type Output; }
åã³ã³ã¹ãã©ã¯ã¿ïŒæ±çšRefIterãªã³ã¯ã«ãŠã³ãã€ãã¬ãŒã¿ãå®è£ ããŸãããã
use std::marker::PhantomData; use std::mem; use std::cmp; // , RefIter struct MyType<'a> { slice: &'a mut [u8], index: usize, } // : trait LifetimeToType<'a> { type Output; } // - , // /// &'* T struct Ref_<T>(PhantomData<T>); /// &'* mut T struct RefMut_<T>(PhantomData<T>); /// MyType<*> struct MyType_; // , impl<'a, T: 'a> LifetimeToType<'a> for Ref_<T> { type Output = &'a T; } impl<'a, T: 'a> LifetimeToType<'a> for RefMut_<T> { type Output = &'a mut T; } impl<'a> LifetimeToType<'a> for MyType_ { type Output = MyType<'a>; } // , ! // `Self::TypeCtor as LifetimeToType<'a>>::Output` // - 'a TypeCtor. // // , : <X as Trait>::AssociatedItem " -", // . // // : , HRTB, // `T: 'a`. // `for<'a> Self::TypeCtor: LifetimeToType<'a>` // `&'a T` `'a`, // `T: 'static`! // "where" `next`. trait RefIterator { type TypeCtor; fn next<'a>(&'a mut self) -> Option<<Self::TypeCtor as LifetimeToType<'a>>::Output> where Self::TypeCtor: LifetimeToType<'a>; } // ! struct Iter<'a, T: 'a> { slice: &'a [T], } struct IterMut<'a, T: 'a> { slice: &'a mut [T], } struct MyIter<'a> { slice: &'a mut [u8], } // FIXME: https://github.com/rust-lang/rust/issues/31580 // , . // // ( , ) fn _hack_project_ref<'a, T>(v: &'a T) -> <Ref_<T> as LifetimeToType<'a>>::Output { v } fn _hack_project_ref_mut<'a, T>(v: &'a mut T) -> <RefMut_<T> as LifetimeToType<'a>>::Output { v } fn _hack_project_my_type<'a>(v: MyType<'a>) -> <MyType_ as LifetimeToType<'a>>::Output { v } // ( ) impl<'x, T> RefIterator for Iter<'x, T> { type TypeCtor = Ref_<T>; fn next<'a>(&'a mut self) -> Option<<Self::TypeCtor as LifetimeToType<'a>>::Output> where Self::TypeCtor: LifetimeToType<'a> { if self.slice.is_empty() { None } else { let (l, r) = self.slice.split_at(1); self.slice = r; Some(_hack_project_ref(&l[0])) } } } impl<'x, T> RefIterator for IterMut<'x, T> { type TypeCtor = RefMut_<T>; fn next<'a>(&'a mut self) -> Option<<Self::TypeCtor as LifetimeToType<'a>>::Output> where Self::TypeCtor: LifetimeToType<'a> { if self.slice.is_empty() { None } else { let (l, r) = mem::replace(&mut self.slice, &mut []).split_at_mut(1); self.slice = r; Some(_hack_project_ref_mut(&mut l[0])) } } } impl<'x> RefIterator for MyIter<'x> { type TypeCtor = MyType_; fn next<'a>(&'a mut self) -> Option<<Self::TypeCtor as LifetimeToType<'a>>::Output> where Self::TypeCtor: LifetimeToType<'a> { if self.slice.is_empty() { None } else { let split = cmp::min(self.slice.len(), 5); let (l, r) = mem::replace(&mut self.slice, &mut []).split_at_mut(split); self.slice = r; let my_type = MyType { slice: l, index: split / 2 }; Some(_hack_project_my_type(my_type)) } } } // ! fn main() { let mut data: [u8; 12] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; { let mut iter = Iter { slice: &data }; while let Some(v) = iter.next() { println!("{:?}", v); } } { let mut iter = IterMut { slice: &mut data }; while let Some(v) = iter.next() { println!("{:?}", v); } } { let mut iter = MyIter { slice: &mut data }; while let Some(v) = iter.next() { println!("{:?} {}", v.slice, v.index); } } }
äžèšã§äœãèµ·ãã£ãŠãããã解èªã§ãããã©ããã¯ããããŸãããããããå¿ èŠãã©ããã¯ããããŸãããããã§èª¬æããéåžžã®äžé£ã®ã¢ã¯ã·ã§ã³ã§ããäžè¬ã«ãRc / Arcã®åŠçã«åœ¹ç«ã¡ãŸããïŒ
ãããŠã¯ãïŒ
use std::rc::Rc; use std::sync::Arc; use std::ops::Deref; // T -> Output trait RcLike<T> { type Output; fn new(data: T) -> Self::Output; } // struct Rc_; struct Arc_; impl<T> RcLike<T> for Rc_ { type Output = Rc<T>; fn new(data: T) -> Self::Output { Rc::new(data) } } impl<T> RcLike<T> for Arc_ { type Output = Arc<T>; fn new(data: T) -> Self::Output { Arc::new(data) } } struct Node<Ref, T> // `where` ( - ) where Ref: RcLike<Node<Ref, T>>, { elem: T, // : Option<Rc<Node<Rc_, T>> next: Option<<Ref as RcLike<Node<Ref, T>>>::Output> } struct List<Ref, T> where Ref: RcLike<Node<Ref, T>>, { head: Option<<Ref as RcLike<Node<Ref, T>>>::Output> } impl<Ref, T, RefNode> List<Ref, T> where Ref: RcLike<Node<Ref, T>, Output=RefNode>, RefNode: Deref<Target=Node<Ref, T>>, RefNode: Clone, { fn new() -> Self { List { head: None } } fn push(&self, elem: T) -> Self { List { head: Some(Ref::new(Node { elem: elem, next: self.head.clone(), })) } } fn tail(&self) -> Self { List { head: self.head.as_ref().and_then(|head| head.next.clone()) } } } fn main() { // ( , ) let list: List<Rc_, u32> = List::new().push(0).push(1).push(2).tail(); println!("{}", list.head.unwrap().elem); // 1 let list: List<Arc_, u32> = List::new().push(10).push(11).push(12).tail(); println!("{}", list.head.unwrap().elem); // 11 }
ç§ãã¡ã¯ã»ãšãã©å€ãã£ããäžèšã®æ¡ä»¶åŠšãå¥åèïŒRcLike <ããŒã<åèãTã>>ãããã¯ãæœè±¡åã®ç©Žã§ããäžæ¹ã§ãç§ãã¡ã®æ§é ã®ãŠãŒã¶ãŒã¯Nodeã«ã€ããŠçµ¶å¯Ÿã«ç¥ãå¿ èŠã¯ãããŸããããäžæ¹ã§ãããã«èšåããããšã匷å¶ãããŸãããããŠãRefã¯äœã§ãRcLike ã§ãããšèšããŸããæè¡çã«ã¯ãããã¯<T> RefïŒRcLike <T>ã®å Žæã®ããã«èãããŸããããã«ãããRefã®äœ¿çšã«é¢ãããªãã·ã§ã³ã®é åžã®è©³çŽ°ãé ãããšãã§ããŸãã
ããã , , . - , , ! .
( , RFC , , -, â ..)
, , , , , , Rust . , .
åãã¿ã€ãã®2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãå®éã«äº€æå¯èœã§ãããšèããããšã¯ãããŸããïŒãã®ããã2ã€ã®Widgetãããããããã亀æããå Žåã誰ããªãŒãããŸãããã»ãšãã©ã®å Žåãããã¯å€§æè¿ã§ããããããåãã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã®äº€æãçŠæ¢ãããšã©ããªããŸããïŒ
ããšãã°ãé åãé åãå埩åŠçãããšããéåžžã¯èŠçŽ ãååŸããããã«è¡ãããŸãã ïŒãŸãããã®ã¿ã¹ã¯ã¯ãã¢ã¯ã»ã¹èŠçŽ ã«ç°ãªãããŒãºã«é©ããã€ãã¬ãŒã¿ãæäŸããããšãå¿ èŠã§ãã€ãŒã¿ãŒãIterMutãšIntoIterãå埩åãç§ãã¡ã«èªã£ãå Žåãããã¯ãã䟿å©ã§ã¯ãªãã§ãããã©ãã«èŠããããã«ãç§ãã¡ã¯èªã決ããããããã«ãã¹ãããïŒ
çè«çã«ã¯ãé åã«ç¬èªã®ã€ã³ããã¯ã¹ã€ãã¬ãŒã¿ãããã°å¯èœã§ãã0ã1ã2ã...ãlenã®1 - ãã€ã³ããã¯ã¹ãããžãã¹ã§èªåèªèº«ãå®è¡ãã誰ãã幞ãã§ãããã®å Žåã«ã®ã¿ãã€ãã¬ãŒã¿ã®ä¿¡é Œæ§ã圱é¿ãåããŸããéåžžãã€ãã¬ãŒã¿ããã¯ãåèŠçŽ ãå°ãªããšã1åãã©ããŒã¹ãããããšã確å®ã§ããããšãæåŸ ãããèœäžããããšã¯ä¿èšŒãããŠããŸããã
ã€ã³ããã¯ã¹ã«ããã¢ã¯ã»ã¹ã¯ãäžèšã®ãã¹ãŠãç Žå£ããŸããã€ã³ããã¯ã¹ã眮ãæããããšãã§ããé åèªäœãå€æŽããŠã€ã³ããã¯ã¹ãç¡å¹ã«ããããšãã§ããŸããæåŸã«ãããé åã®ã€ã³ããã¯ã¹ã誀ã£ãŠå¥ã®é åã«ãã«ããããšãã§ããŸããããããããã¯ãã¹ãŠãããŸããŸãªçšåºŠã®åªåã§è§£æ±ºå¯èœã§ããã€ã³ããã¯ã¹ã®çœ®æã«å¯ŸããŠ-ãããã®åã©ãããŒã§ããããããŠãŒã¶ãŒã¯å®éã®å€ã䜿çšã§ããŸãããã€ã³ããã¯ã¹ã®ç¡å¹åã«å¯ŸããŠãã€ã³ããã¯ã¹ãé åã®å¯¿åœã«ãªã³ã¯ãããšåœ¹ç«ã¡ãŸãã
ãããŠãé åèªäœã®çœ®æã§ã¯ãã©ãã§ããïŒ 2ã€ã®é åãããããããã®ã€ã³ããã¯ã¹ã®ã¿ã€ãã¯åäžã§ãããäºå®äžäº€æå¯èœã§ãããããã¯æãŸãããããŸãããç§ãã¡ãååŸããæ¹æ³ïŒUNïŒãåŒã°ãããäžè¬åïŒãžã§ãïŒãäžè¬åå¯èœæ§ã¯ãç°ãªãé¢é£åãæã€åãåã®ç°ãªãã€ã³ã¹ã¿ã³ã¹ãææãããšããèãã«åºã¥ããŠããŸããé¢é£ä»ããããåã®å€ã¯ãåã€ã³ã¹ã¿ã³ã¹ãã€ãŸãã§ãã
ç²ãããã²ã©ãç²ããããšã«ããããã§ãã£ããã·ã¥ã©ã€ã³ã«è¿ã¥ããŠããã®ã§ãå ã»ã©æžããäžèšã®ãã¢ãã³ããŒããŸãããšã«ããããã¹ãŠãã³ã¡ã³ãã«ããã®ã§ãèªãã§ãã ããã
// , // "" // . , // , . // ( Vec, ). // // " ", // . // , , // ( ?). // , , // , . // . // (let idx = arr.validate(idx)). // // - // , , // ( moving values in/out try!). // , // , , , . // // API ( , Vec -- `push` `pop`. // . // // , , // , // // gereeter // BTreeMap. ST Monad Haskell . // // , // &[T] &mut [T]. fn main() { use indexing::indices; let arr1: &[u32] = &[1, 2, 3, 4, 5]; let arr2: &[u32] = &[10, 20, 30]; // ( , ) indices(arr1, |arr1, it1| { indices(arr2, move |arr2, it2| { for (i, j) in it1.zip(it2) { println!("{} {}", arr1.get(i), arr2.get(j)); // // println!("{} ", arr2.get(i)); // println!("{} ", arr1.get(j)); } }); }); // , let _a = indices(arr1, |arr, mut it| { let a = it.next().unwrap(); let b = it.next_back().unwrap(); println!("{} {}", arr.get(a), arr.get(b)); // a // , }); // , let (x, y) = indices(arr1, |arr, mut it| { let a = it.next().unwrap(); let b = it.next_back().unwrap(); (arr.get(a), arr.get(b)) }); println!("{} {}", x, y); // : !? // (: ) } mod indexing { use std::marker::PhantomData; use std::ops::Deref; use std::iter::DoubleEndedIterator; // Cell<T> T; Cell<&'id _> `id` . // , // 'id "" . type Id<'id> = PhantomData<::std::cell::Cell<&'id mut ()>>; pub struct Indexer<'id, Array> { _id: Id<'id>, arr: Array, } pub struct Indices<'id> { _id: Id<'id>, min: usize, max: usize, } #[derive(Copy, Clone)] pub struct Index<'id> { _id: Id<'id>, idx: usize, } impl<'id, 'a> Indexer<'id, &'a [u32]> { pub fn get(&self, idx: Index<'id>) -> &'a u32 { unsafe { self.arr.get_unchecked(idx.idx) } } } impl<'id> Iterator for Indices<'id> { type Item = Index<'id>; fn next(&mut self) -> Option<Self::Item> { if self.min != self.max { self.min += 1; Some(Index { _id: PhantomData, idx: self.min - 1 }) } else { None } } } impl<'id> DoubleEndedIterator for Indices<'id> { fn next_back(&mut self) -> Option<Self::Item> { if self.min != self.max { self.max -= 1; Some(Index { _id: PhantomData, idx: self.max }) } else { None } } } pub fn indices<Array, F, Out>(arr: Array, f: F) -> Out where F: for<'id> FnOnce(Indexer<'id, Array>, Indices<'id>) -> Out, Array: Deref<Target = [u32]>, { // . // (, // F). , `indices` // , . // // // , `'static`, , // *this*. . // , , // // , . // // , // , , . // , , // . let len = arr.len(); let indexer = Indexer { _id: PhantomData, arr: arr }; let indices = Indices { _id: PhantomData, min: 0, max: len }; f(indexer, indices) } }
ã ããããããªã«ç°¡åãããªãïŒããããçŽç²ãªå°çããããŠãããã¯ãã¹ãŠæ¯ãã®ãã»ã©å®å šã§ãªããå£ãããããã®ã§ããããã«å¯ŸããŠãå®å šã§ãªããµãŠã³ãã䜿çšããããšã«å¯ŸããRustã®äž»åŒµã¯ãèœäžãã建ç©ã«èªããªãäžå¯§ãªèŠæ±ã®ãããªãã®ã§ããã·ã¹ãã ã®å®å®æ§ã¯ãã¹ãŠã®ã¿ã€ãã®ãã£ãªã°ãªãŒãã£ããïŒããã³å¯¿åœãç¹ã«å¯¿åœ-çŽPerãïŒã«äŸåããŸãæãå±éºãªç¶æ ãäžæ¹ãå®å šã§ãªããšããŒã¯ãããè¡ã¯ãã£ã³ãã¹äžã®å¯äžã®æ¡ä»¶ã§ãã
ããã°ã©ã ã®äžè¬åå¯èœæ§ãžã®äŸåã¯ãç²æ«å庫ã§ã®å«ç ã«ãããªãã®ã§ãæ¢åã®æ§æã®ããŸãç¥ãããŠããªãé ããHTRBããå°ããã€åéããã®ã§ã¯ãªããRustã®äžè¬åå¯èœæ§ãçŽæ¥ãµããŒãããããšãæ¬åœã«æåŸ ããŠããŸãã
ãšã«ãããããã§ååã§ããäœãæžãåã¯ãã以äžãããŸããããã¹ãŠãã©ãã«ãåŒã£åŒµãããŸããã§ãããèš±ããŠãã ããããé¡ãããŸãã