Alexis Beingessner ã«ãããã®èšäºã¯ãRustã®åã·ã¹ãã ã®æãå
æ¬çãªèª¬æã§ãããããã䜿ã£ãŠäœãã§ããããèŠã€ããŸããã 誰ãããã®ç¿»èš³ã圹ç«ã€ãšæãããšãé¡ã£ãŠããŸãã æãããªããšãæåã«èšè¿°ãããŠãããšããäºå®ãèŠãªãã§ãã ãã-ããªãã¯æåŸã«drããŸãã ãã®èšäºã¯å·šå€§ã§ãããã»ãšãã©ã®å Žåç« ã«åãããŠããŸãã éåžžã«èªç±ã«ç¿»èš³ãããŸããã èè
ã®ã¹ã¿ã€ã«ãä¿åãããŸããã -çŽïŒ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 ! ããã®ä»ãã¹ãŠïŒïŒ
åŸè
ã¯ãå€ãã®å埩çãªã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãã
ããã«å
éšçã«
䜿çšãããŸãã
ç§ã®èãã§ã¯ããã¯ãã¯ã³ãŒããåå©çšããææªã®æ¹æ³ã§ãã 圌ãã¯
äœããã®åœ¢ã§åœ¹ç«ã€ã¯ãã§ãïŒå€æ°åã¯å
éšã§äœ¿çšãããŠãããããã¯ããããªãŒã¯ããŸããïŒãããããã奜ã人ãããããããŸãïŒãã¯ãã§
å®å
šã§
ãªããã®ã䜿çšãããšãå¥åŠãªå¯äœçšãçºçããŸãïŒã©ãã§ãããïŒ-çŽãã©ã³ã¹ïŒïŒã ãã¯ããã³ãã©ãŒã¯æ£èŠè¡šçŸã«åºã¥ããŠããïŒ
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) {
ããã ãã§ã ããã«ãäžè¬çãªã¿ã€ãã®
IpAddressãæäœã§ããŸãããŸããå
éšã®æ£ç¢ºãªã¿ã€ããç¥ãå¿
èŠãããå Žåã¯ã
matchã䜿çšããŠäžèšã®æ¹æ³ã䜿çšããŠ
ãã£ãã·ã³ã°ã¢ãŠãã§ããŸãã
ç¹æ§
ãããŸã§ã¯ããã¹ãŠãã·ã³ãã«ã§ããããä»ã§ã¯ããè€éã§è峿·±ããã®ã«ãªããŸãã
èŠããã«ãRustã®ç¹æ§ã¯ã
ä»ã®ãã¹ãŠãèšè¿°
ããããã«èšèšãã
ãŠããŸã ã åçžåãä»®æ³åããªãã¬ã¯ã·ã§ã³ãæŒç®åã®ãªãŒããŒããŒããå倿ãã³ããŒã®ã»ãã³ãã£ã¯ã¹ãã¹ã¬ããã»ãŒããã£ã髿¬¡é¢æ°ãã«ãŒãã®ã€ãã¬ãŒã¿ãŒ-ãã®ã«ã©ãã«ãªããããã£ã³ã³ã¯ãã¹ãŠç¹æ§ãä»ããŠæ©èœããŸãã ããã«ããã¹ãŠã®æ°ãããŠãŒã¶ãŒèšèªæ©èœã¯ãã»ãšãã©ã®å Žåãç¹æ§ãéããŠå®è£
ãããŸãã
äžè¬çã«ãç¹æ§ã¯ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ããããæ¬åœã«ã
struct MyType { data: u32, }
å€ãã®å Žåãç¹æ§ãšã®éä¿¡ã¯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ã«å®è£
ãããŸãã
ãµããã芧ã®ãšãããã€ã³ã¿ãŒãã§ã€ã¹ãšãã®å®è£
ãå®çŸ©ããå¿
èŠãçãããããã«ãäžè¬æ§ã®ããŸããŸãªããªãšãŒã·ã§ã³ã«å¯ŸããŠå¹
åºãéžæè¢ããããŸãã ãããŠãã³ã³ãã€ã©ã®å
éšã§ã¯ãç§ãèšã£ãããã«ãããã¯ãã¹ãŠå圢åããŸãã å°ãªããšãæåã®æé©åãŸã§ã次ã®äžéã³ãŒããååŸããŸãã
é©ããããããŸãããïŒé©ãããšããããŸãããïŒãããã€ãã®éèŠãªæ©èœã¯
å€ãã®å Žæã«ã€ã³ã©ã€ã³åãã
ãŠããŸãã ããšãã°ãbrsonã¯Servoã³ãŒã
ã§1700åãè¶
ãã Option :: mapã® ã³ããŒãèŠã€ããŸããã äžè¬ã«ãããããã¹ãŠã®åŒã³åºããä»®æ³åãããšãå®è¡æã®ããã©ãŒãã³ã¹ãå®å
šã«äœäžããŸãã
ãŸãéèŠïŒåå®çŸ©ãšæŒç®åãã¿ãŒããã£ãã·ã¥ã
ïŒãturbofishããããããŸã翻蚳ããããšã¯ã§ããŸããããªãã·ã§ã³ã¯å€§æè¿ã§ã-çŽãïŒ
Rustã®ãžã§ããªãã¯ã¯ãåãèªåçã«æ€åºããŸãã ã¿ã€ããã©ããã«æå®ãããŠããå Žåããã¹ãŠãæèšã®ããã«æ©èœããŸãã æå®ãããŠããªãå Žåãè±ç«ãå§ãŸããŸãïŒ
ç¹æ§ãªããžã§ã¯ã
ããã§ã¯ãããã§ä»®æ³åã¯ã©ããªã£ãŠããã®ã§ããããïŒ åã«é¡ã®ãªããäœããã«ãªãããã«ãç¹å®ã®ã¿ã€ãã«é¢ããæ
å ±ãåé€ããã«ã¯ã©ãããã°ããã§ããïŒ 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() {
ãã€ã³ã¿ã®åŸãã«ç¹å®ã®ã¿ã€ããé衚瀺ã«ãããšããèŠä»¶ã¯ãäžèŠæããã以äžã®çµæãããããããšã«æ³šæããŠãã ããã ããã«ãäŸãã°ãç§ãã¡ã®å€ãããªãã¿ã®ç¹åŸŽããããŸãïŒ
trait Clone { fn clone(&self) -> Self; }
ç¹æ§ã¯ã
å€ã«ãã£ãŠç¬èªã®ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãè¿ã颿°ãå®çŸ©
ããŸã ã
fn main() { let x: &Clone = ...;
ãããã
yã®ããã«ã¹ã¿ãã¯äžã«ã©ã®ãããã®ã¹ããŒã¹ã確ä¿ããå¿
èŠããããŸããïŒ åœŒã¯ã©ããªã¿ã€ãã§ããïŒ
çãã¯
ãã³ã³ãã€ã«æ®µéã§ã¯ãããããããªããšãã
ããšã§ã ã ããã¯ã
ã¯ããŒã³ã®ç¹æ§ãå®éã«ã¯ç¡æå³ã§ããããšã瀺åããŠããŸãã ããæ£ç¢ºã«ã¯ãå€ãšããŠã®ç¬èªã®åãžã®åç
§ãå«ãŸããŠããå ŽåïŒããã³ãã€ã³ã¿ãŒã§ã¯ãªããçŽPerãïŒãç¹æ§ãç¹æ§ãªããžã§ã¯ãã«å€æããããšã¯ã§ããŸããã
ç¹æ§ãªããžã§ã¯ãã¯ãRustã§ããªãäºæ³å€ã®æ¹æ³ã§å®è£
ãããŸãã èŠããŠãããŠãã ãã-éåžžããã®ç®çã®ããã«ä»®æ³åããã颿°ããŒãã«ã䜿çšãããŸãã ãã®æ¹æ³ã«ã¯ãå°ãªããšã2ã€ã®çç±ããããŸãã
ãŸããå¿
èŠããããã©ããã«é¢ä¿ãªãããã¹ãŠããã€ã³ã¿ãŒã®èåŸã«æ ŒçŽãããŸãã ã€ãŸããåãä»®æ³åå¯èœãšããŠå®çŸ©ãããŠ
ããå Žåããã®åã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã®ãã€ã³ã¿ãŒãæ ŒçŽããå¿
èŠããããŸã ã
2ã€ç®ã¯ãä»®æ³ããŒãã«ããå¿
èŠãªé¢æ°ãååŸããããšã§ããã¿ã¹ã¯ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ããã¯ãã¹ãŠãã€ã³ã¿ãŒãã§ã€ã¹ãäžè¬ã«ãå€éç¶æ¿ã®ç¹æ®ãªã±ãŒã¹ã§ãããšããäºå®ã«ãããã®ã§ãïŒC ++ã§ã¯ãå€éç¶æ¿ã¯å®å
šã§ãïŒã äŸãšããŠããããã®ã»ãããæ¬¡ã«ç€ºããŸãã
trait Animal { }
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ãïŒãçµæãšããŠããã®ã³ãŒãã¯æå¹ã§ãã
ãã£ãããã
å®ç§ã§ã¯ãããŸããããæ¥œããã§ããæ®å¿µãªããã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>; }
ãããŸã§ã®ãšããè¯ããã€ã³ã¿ãŒãã§ã€ã¹ã®äžè¬çãªå®è£
ãšãã©ã€ããŒããªå®è£
ã®äž¡æ¹ãèšè¿°ã§ããŸãããããŠå¥è·¡ãèµ·ãã£ã-å宿°åã¯Iteratorã äžåºŠããå®è£
ã§ããªãã StackIter <Cat>ã¯Iterator <Cat>ã®ã¿ãå®è£
ããIterator <Dog>ãå®è£
ããå¿
èŠã¯ãããŸãããå®éã圌ã¯ä»ã®äœããå®è£
ããããšãèš±å¯ãããŠããŸãããããããªããšãå®è£
ãããã¿ã€ãã®Iterator :: nextïŒïŒãè¿ããããªããžã§ã¯ãã«ãŠãŒã¶ãŒã¯å°æããŸããããã§ãæã
ã¯ãããéåžžã«åãã§ããTã¯ãå
¥åã¿ã€ããšããŠã€ãã¬ãŒã¿ãããã¯å
¥åãšåãã¿ã€ãã - Tã®ããã®StackIterãããã§ãããŠãŒã¶ãŒãšããŠã¯Iterator :: nextïŒïŒã«ãã£ãŠè¿ãããåãããŒãã³ãŒãã£ã³ã°ã§ããªããããããããã®è±åºã¯ãããŸããããã®æ
å ±ã¯ãå埩åãå®è£
ããåãæäŸããããã«å¿
èŠã§ãïŒããŸã楜ãããªããã®ç¬éã«ãé¢é£ããåã«ç²Ÿéããæãæ¥ãŸãããé¢é£ä»ããããåã«ãããç¹æ§ã®å®è£
ãç¹å®ã®å®è£
ã«é¢é£ä»ãããã远å ã®åã瀺ãå¿
èŠãããããšã瀺ãããšãã§ããŸããã€ãŸããç¹æ§ã¯ç¹å®ã®é¢æ°ãšåãæ¹æ³ã§ç¹å®ã®ã¿ã€ããå¿
èŠãšãããšããããšã§ããé©åã«åäœæãããIteratorãæ¬¡ã«ç€ºããŸãã trait Iterator {
ãããŠã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 {
ããã§ã¯ãé¢é£ããã¿ã€ããªãã§ã®ã¿ãå€ãç¶æ
ãã·ã³ãæç»ããŸãããå
ã®ã€ã³ã¹ã¿ã³ã¹ãåžåããŸãïŒèªå·±ã¯åçšãããŸãããã€ãŸããã¹ãããïŒïŒã®å®äºåŸãããã䜿çšããããšã¯ã§ããªããªããŸã-çŽPerãïŒãåºåã§ã¯ãã¹ããŒããã·ã³ãå®è£
ããäœããååŸããŸãããã ãããããæ©èœããããã«ã¯ããã¹ãŠã®ã¹ããŒããã·ã³ã®äœ¿çšãããŒãäžã®å®è£
ã®ã¿ã«å¶éããå¿
èŠããããŸãããŸããstepïŒïŒã®æåã®åŒã³åºãåŸã«ç¹å®ã®ã¿ã€ãã®ãã·ã³ã«é¢ããæ
å ±ã倱ãããŸãã飿³åã§ã¯ã1çªç®ã2çªç®ãçºçããŸããããããŠããã1ã€ãããŸããç¹æ§ãªããžã§ã¯ãã¯ãé¢é£ããåã§ã¯æ©èœããŸããã圌ããå€ã«ããèªå·±ã§åäœããªãåãçç±ã§ãå
·äœçãªå®è£
ã¿ã€ãã¯äžæã§ããåéã«ããæ¹æ³ã¯ãç¹å®ã®ã¿ã€ãããã¹ãŠæå®ããããšã§ããBox <Iterator>ã¯å®£èªããBox <Iterator <Item = u32 >>ã¯éåžžã«ããŸãèµ·åããŸããã©ãæ¡ä»¶
å€ãäŸïŒ impl<T> Generic<T> {
ããã§ãåãé¢é£ä»ããæ¹æ³ãããããŸãããããã¯ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
ãããŠãããã«è§£æ±ºçããããŸã-ãã©ããæ¡ä»¶ã 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);
髿¬¡ç¹æ§ã®å¶é
ãã®æç¹ã§å±æ ¹ããŸã ãªããªã£ãŠããªãå Žåã¯ã次ã®ã»ã¯ã·ã§ã³ã§ã¯å±æ ¹ãéããªãã®ã§ã幞éã§ããççŽã«èšã£ãŠæ³¥ã ããã®æ²Œå°ãçºçããããã§èª¬æãããŸãããå·åã·ã¹ãã ã®æªåé«ãçä¿¡è
ã ãããããã³ã°ã楜ããããšãã§ããŸããæ¬¡ã«ã髿©èœã®é¢æ°ãäœæããŸãããããã®é¢æ°ã¯ãã颿°ã§æ©èœãã颿°ãã§ããçŸããæåãªäŸã¯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; }
<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ã§ããããã«ãç§ã¯ããªãã«åãã€ãããæ¹æ³ãšçç±ãã€ãã¬ãŒã¿ãŒã®ãã£ã«ã¿ãŒã®äŸã瀺ããŸãã
èŠç¥ãã¬äººãšå¥åŠãªã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ã«é¢ããŠæ§é ãäžè¬åããå¿
èŠããããŸããçæ³çã«ã¯ã次ã®ããã«æžããŸãã
ãããŒãããã¯ã§ããŸããïŒãŠãŒã¶ãŒã¯ããã§RcãŸãã¯Arcãéä¿¡ã§ããªããããããã¯ããããŸãããåã¯äžè¬åãããŠãããRc <SomeType>ã®ããã«ãååŒæ°ãã¹ãªããããããšã«ãã宿ããå¿
èŠããããŸããã»ããRc <Node <T >>ã®ç¹æ§ãèãåºãããšãã§ããŸãããããã¯RcãšArcãçŽæ¥æäœãããããæ¶åããã«ããã§ããããã¯ãããŒã³ãè¿ããžã§ããªãã¯ã§ã次ã®ããã«äœ¿çšã§ããŸãã
æ¢ã«ç¥ã£ãŠããããã«ãããã¯ãã ã®ç ç³ã§ã 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;
äžèšã§äœãèµ·ãã£ãŠããããè§£èªã§ãããã©ããã¯ããããŸãããããããå¿
èŠãã©ããã¯ããããŸãããããã§èª¬æããéåžžã®äžé£ã®ã¢ã¯ã·ã§ã³ã§ããäžè¬ã«ãRc / Arcã®åŠçã«åœ¹ç«ã¡ãŸããïŒãããŠã¯ãïŒ use std::rc::Rc; use std::sync::Arc; use std::ops::Deref;
ç§ãã¡ã¯ã»ãšãã©å€ãã£ããäžèšã®æ¡ä»¶åŠšãå¥åèïŒ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ïŒãåŒã°ãããäžè¬åïŒãžã§ãïŒãäžè¬åå¯èœæ§ã¯ãç°ãªãé¢é£åãæã€åãåã®ç°ãªãã€ã³ã¹ã¿ã³ã¹ãææãããšããèãã«åºã¥ããŠããŸããé¢é£ä»ããããåã®å€ã¯ãåã€ã³ã¹ã¿ã³ã¹ãã€ãŸãã§ããç²ãããã²ã©ãç²ããããšã«ããããã§ãã£ããã·ã¥ã©ã€ã³ã«è¿ã¥ããŠããã®ã§ãå
ã»ã©æžããäžèšã®ãã¢ãã³ããŒããŸãããšã«ããããã¹ãŠãã³ã¡ã³ãã«ããã®ã§ãèªãã§ãã ããã
ã ããããããªã«ç°¡åãããªãïŒããããçŽç²ãªå°çããããŠãããã¯ãã¹ãŠæ¯ãã®ãã»ã©å®å
šã§ãªããå£ãããããã®ã§ããããã«å¯ŸããŠãå®å
šã§ãªããµãŠã³ãã䜿çšããããšã«å¯ŸããRustã®äž»åŒµã¯ãèœäžãã建ç©ã«èªããªãäžå¯§ãªèŠæ±ã®ãããªãã®ã§ããã·ã¹ãã ã®å®å®æ§ã¯ãã¹ãŠã®ã¿ã€ãã®ãã£ãªã°ãªãŒãã£ããïŒããã³å¯¿åœãç¹ã«å¯¿åœ-çŽPerãïŒã«äŸåããŸãæãå±éºãªç¶æ
ãäžæ¹ãå®å
šã§ãªããšããŒã¯ãããè¡ã¯ãã£ã³ãã¹äžã®å¯äžã®æ¡ä»¶ã§ããããã°ã©ã ã®äžè¬åå¯èœæ§ãžã®äŸåã¯ãç²æ«å庫ã§ã®å«ç
ã«ãããªãã®ã§ãæ¢åã®æ§æã®ããŸãç¥ãããŠããªãé
ããHTRBããå°ããã€åéããã®ã§ã¯ãªããRustã®äžè¬åå¯èœæ§ãçŽæ¥ãµããŒãããããšãæ¬åœã«æåŸ
ããŠããŸãããšã«ãããããã§ååã§ããäœãæžãåã¯ãã以äžãããŸããããã¹ãŠãã©ãã«ãåŒã£åŒµãããŸããã§ãããèš±ããŠãã ããããé¡ãããŸãã