Rustã®æææ¨©ï¼ownershipï¼ãèªç¾©ããçè§£ãã
æææ¨©ï¼ownershipï¼ã¨åç¨ï¼borrowingï¼ã¨ã©ã¤ãã¿ã¤ã ï¼lifetimeï¼ã¯Rustç¹æã®è¨èªä»æ§ã¨ãã¦æåã§ããã
Rustã§ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ï¼GCï¼ã使ç¨ããã«ã¡ã¢ãªå®å ¨æ§ã確ä¿ããããã«æææ¨©ã¨åç¨ã¨ã©ã¤ãã¿ã¤ã ã®ä»æ§ãæ¡ç¨ãã¦ããã ãã®æ©æ§ã«ãã£ã¦ãRustã§ã¯ããã°ã©ãã夿°ã®å¤ãæå¹ã§ããç¯å²ãæèããå¿ è¦ããã代ããã«ãGCã«é¢ããå®è¡æã®ãªã¼ãã¼ãããããªãã¨ãã¡ã¢ãªå®å ¨ã§ããã¹ã¬ããã»ã¼ãã§ããããã°ã©ã ãè¨è¿°ãããã¨ãã§ããã
䏿¹ã§ãæææ¨©ã¯ãã夿°ãå¤ã®æææ¨©ãæã£ã¦ãããã¨ããã®ã¯çµå±ä½ã®ãã¨ãªã®ãããããªããã¨ããæ··ä¹±ãçãè¦å ã§ãããã åç´ã«èããã¨ã夿°ã«å¤ãå ¥ã£ã¦ããã®ã ããã夿°ãå¤ãæã£ã¦ããã®ã¯å½ç¶ã®ãã¨ã®ããã«æããã ããããã¨ããå¤ã®æææ¨©ãæã¤ãã¨ã¯ä¸ä½ä½ã®ãã¨ãè¨ã£ã¦ããã®ããã¯ã£ããã¨ããªããªã£ã¦ãã¾ãã ãã®æ··ä¹±ãçè§£ã®å°é£ãã®åå ã®ä¸ã¤ã¯ãåèªã§ããè±èªã¨æ¥æ¬èªã®éã§æææ¨©ï¼ownershipï¼ã¨ããåèªã®ãã¥ã¢ã³ã¹ãéããã¨ã§ããã ãã®è¨äºã§ã¯ãownershipã®è±èªã®èªç¾©ãããRustã®æææ¨©ã¨ããç¨èªãä½ã表ãã¦ããã®ãã説æããã
æ¥æ¬èªè¾æ¸ãè¦ã
ã¾ãã¯æ¥æ¬èªã®ãæææ¨©ãã¨ããåèªã®æå³åããå確èªãã¦ãããã
å°å¦é¤¨ã®ãã¸ã¿ã«å¤§è¾æ³ã®ãæææ¨©ãã®è§£èª¬ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ããã
ããããâãããã·ã¨ã¤ã¦âããæææ¨©ã
ç©ãå ¨é¢çã«æ¯é ããç©æ¨©ãæ³ä»¤ã®å¶éå ã§ãç®çç©ãèªç±ã«ä½¿ç¨ã»åçã»å¦åã§ããæ¨©å©ã
ã¤ã¾ããæ¥æ¬èªã§ãæææ¨©ãã¨ããã¨ãææãã¦ãããã®ãèªç±ã«ä½¿ããã¨ãã§ããã¨ãã便çã®å´é¢ãå¼·ãæèããè¨èã«ãªãã ãããã£ã¦ããå¤ã®æææ¨©ãæã¤ãã¨ãã表ç¾ã§ã¯ãå¤ãèªç±ã«ä½¿ããã¨ããï¼ä¸è¦ï¼å½ç¶ã®ãã¨ãè¨ã£ã¦ããããã«éããªãããã«æããããããã§ããã ããããå®ã¯Rustã§ã®æææ¨©ï¼ownershipï¼ãæå³ãã¦ããã®ã¯ããã ãã§ã¯ãªãã ãããçè§£ããã«ã¯ãè±èªã®ownershipã®èªç¾©ãè¦ãå¿ è¦ãããã
è±è±è¾æ¸ãè¦ã
è±èªã§ãownershipãã¨ãã£ãã¨ãã®æå³åãã¯æ¥æ¬èªã®ãæææ¨©ãã¨ã©ãå¤ãã£ã¦ããã®ã ãããã
ã¾ããownershipã®èªç¾©ã調ã¹ãããã« Oxford Advanced Learner's Dictionary (OALD) ã§èª¿ã¹ã¦ã¿ãã¨ã以ä¸ã®å®ç¾©ãè¦ã¤ããã
ownership noun [uncountable]
the fact of owning something
(æ¦è¨³: ä½ããææãã¦ããã¨ããäºå®)
ã¤ã¾ããownershipã¨ã¯ä½ããownãã¦ããã¨ãããã¨ã§ããã
ããã ãã§ã¯ownã®æå³ãããããªãã®ã§ãæ´ã«ownã®èªç¾©ãå¼ãã¨ä»¥ä¸ã®å®ç¾©ãè¦ã¤ããã
own verb
1 [transitive] own something to have something that belongs to you, especially because you have bought it
(æ¦è¨³: ä½ããèªåã®ãã®ã¨ãã¦ææãããç¹ã«ãããè³¼å ¥ãããã¨ã«ãã£ã¦ææãã¦ãã)2 [transitive] own something (business) to manage and take responsibility for something
(æ¦è¨³: ï¼æ¥åä¸ï¼ä½ãã管çãããã«å¯¾ãã¦è²¬ä»»ãåããã®ã¨ãã¦ææãã)
1
ã®å®ç¾©ã¯æ¥æ¬èªã®ãææãããã®èªç¾©ã¨ã ãããä¸è´ãã¦ããã
ï¼èªåã®ãã®ã§ããã¨ãããã¨ã¯ããã«å¯¾ãã¦æ¨©å©è¡ä½¿ã§ããã¨ãããã¨ã§ããï¼
ãã®å®ç¾©ã§éè¦ãªç¹ã¯ãææç©ã1ã¤ã®ææè
ã«å±ãã¦ããï¼belongï¼ã¨ãããã¨ã§ããã
ã¤ã¾ããå
±åææã®ãããªè¤æ°ã®æ¨©å©è
ããããããªç¶æ³ã¯è¡¨ããªãã
ããã«éè¦ãªã®ã¯ 2
ã®å®ç¾©ã§ãæ¥æ¬èªã§è¨ãã¨ããã®ï¼æ¥åä¸ã®ï¼ç®¡ç責任ã«è¿ããã®ã示ããã¦ããã
ãã¡ãã®æå³ã¯æ¥æ¬èªã®ãææãããã«ã¯æ®éã¯å«ã¾ãã¦ããªãã
å°ãRustããå¤ããããããã¼ã ãã³ã¼ããã¼ã¹ã«ãªã¼ãã¼ã·ãããæã¤ãã¨ããã¤ã³ãã©ãªã¼ãã¼ã·ããããªã©ã¨ããã¨ãã®ownershipã¯ããã¡ãã®æå³ã§ããã
ããã¦ãRustã®ç¨èªã¨ãã¦ã®æææ¨©ï¼ownershipï¼ã¯ã 1
㨠2
ã®ä¸¡æ¹ã®è¦ç´ ãæã¤ã
ã¤ã¾ããå¤ãå¯ä¸ã¤ã®ææè
ãææãã¦ãã(1
)ãå¤ã«å¯¾ãã管çã®è²¬ä»»ãæã£ã¦ãã(2
)ã¨ãããã¨ãæå³ãã¦ããã
Rustã®ç¨èªã¨ãã¦ã®æææ¨©ï¼ownershipï¼
ä¸ã§è¦ã¦ããããã«ãRustã®ç¨èªã¨ãã¦ã®æææ¨©ï¼ownershipï¼ã¯ãå¤ãå¯ä¸ã¤ã®ææè ãææãã¦ãããå¤ã«å¯¾ãã管çã®è²¬ä»»ãæã£ã¦ããã¨ãããã¨ãæå³ãã¦ããã ã§ã¯å ·ä½çã«å¤ã®ææè ã®è²¬ä»»ã¨ã¯ä½ã§ããããã çµè«ããè¨ãã¨ãRustã®æææ¨©ã¨ã¯ãæ§é ä½ãåæä½ã®ããã«ä»ã®å¤ãææããå¤ãç ´æ£ï¼dropï¼ãããã¨ãããã®å¤ã®ä¸ã®å¤ï¼ãã£ã¼ã«ã夿°ãªã©ï¼ãå帰çã«ç ´æ£ãã義åãæã¤ã¨ãããã¨ã§ããã
Rustã§ã¯ããã©ã«ãã§ã¯ã³ã¼ã«ã¹ã¿ãã¯ä¸ã«å¤æ°ãé ç½®ããæ§é ä½ãåæä½ã®ãã£ã¼ã«ãã§ããæ§é ä½ãªã©ã¯ãè¦ªã®æ§é ä½ãªã©ã«åãè¾¼ã¾ããããããããã®æ§é ä½ãªã©ãåãªãå¤ã®å ´åã¯ç¹ã«å¦çã¯ä¸è¦ã§ããã ç ´æ£å¦çãå¿ è¦ã«ãªãã®ã¯ä»¥ä¸ã®ãããªå¤ã§ããã
- æç¤ºçã«ãã¼ãé åã«ç¢ºä¿ãããå¤ï¼
Box<T>
ï¼ - å
é¨çã«ãã¼ãé åã確ä¿ãã¦ããå¤ï¼
Vec<T>
ãString
ï¼ - ã¡ã¢ãªä»¥å¤ã®çµäºå¦çãå¿
è¦ãªå¤ï¼
File
ãMutexGuard<T>
ï¼
ãããã®å¤ã¯åã«ã¹ã¿ãã¯ã親ã¨ãªãæ§é ä½ãªã©ã«åç´ã«åãè¾¼ã¾ããã ãã§ã¯ãªããå¥ã®å ´æã®ã¡ã¢ãªé åããã®ä»ã®ãªã½ã¼ã¹ï¼ãã¡ã¤ã«ãã³ãã«ãªã©ï¼ãæã£ã¦ããããããããã®å¤ãç ´æ£ããã¨ãã¯ãããã®å 容ç©ããã¡ãã¨çµäºå¦çãè¡ã£ãå¾ç ´æ£ããå¿ è¦ãããã ãã®ããã¡ãã¨å¤ãç ´æ£ãã責任ããæææ¨©ï¼ownershipï¼ã«ã¯å«ã¾ãã¦ããã
ãã®ãããªãææè ãææããå¤ãç ´æ£ãããã¨ããè¦åã§ãã¾ãåä½ããã«ã¯ãå¤ã®æã¡ä¸»ã¯å¿ ã1ã¤ã§ãªããã°ãªããªãã ææè ãåå¨ããªãå¤ã¯ç ´æ£ãããªãããããã®ã¾ã¾æ®ãç¶ãã¦ã¡ã¢ãªãªã¼ã¯ããã®ä»ã®ãªã½ã¼ã¹ãªã¼ã¯ã®åå ã«ãªã£ã¦ãã¾ãã ææè ã2ã¤ä»¥ä¸ããã¨ãå ã«ç ´æ£ãããææè ãå¤ãç ´æ£ãã¦ãã¾ãã®ã§ãã以å¤ã®ææè ãå¤ã使ããã¨ããã¨ãã«æªå®ç¾©åä½ã«ãªã£ã¦ãã¾ãã(use after free)ã2çªç®ä»¥éã«ç ´æ£ãããææè ãæ¢ã«è§£æ¾ããã¦ãããªã½ã¼ã¹ãã¾ãè§£æ¾ãããã¨ãããã¨ãæªå®ç¾©åä½ã«ãªã(double free)ã
Rustã§ã¯æå³çã«è¤æ°ã®ææè
ãå®ç¾ãããå ´åãRc<T>
ãªã©ã®åãæç¤ºçã«ä½¿ããã¨ã§å®è£
ã§ããããã«ãªã£ã¦ããã
Rc<T>
ã¯ä»æ®ã£ã¦ããææè
ã®æ°ãã«ã¦ã³ãããæå¾ã«æ®ã£ãææè
ãå¤ãè§£æ¾ããããã«ãããã¨ã§use after freeãdouble freeãé²ãï¼ãã®ä»£ãããã¡ã¢ãªãªã¼ã¯ãå®å
¨ã«ã¯é²ããªããªãï¼ã
ãã®å¦çã«ã¯å®è¡æã³ã¹ãããããã®ã§ãããã©ã«ãã§ã¯ãªãå¿
è¦ãªã¨ãã«æç¤ºçã«æå®ããããã«ãªã£ã¦ãããããã¯ã¼ããªã¼ãã¼ãããã®ååï¼Zero Overhead Principalï¼ã®å®ä¾ã®ä¸ã¤ã§ããã
å®ä¾ï¼ãå帰çã«å¤ãç ´æ£ãã
å®ä¾ã¨ãã¦ãããã°ã©ããã¡ã¢ãªç®¡çãè¡ãC, æææ¨©ã®æ©æ§ãã¡ã¢ãªç®¡çãè¡ãRust, GCæ©æ§ãã¡ã¢ãªç®¡çãè¡ãRubyã®3è¨èªã§ãå ¥ãåã®åç §ãç ´æ£ãããä¾ãè¦ã¦ã¿ããã
C
以ä¸ã®Cè¨èªã®ã³ã¼ãä¾ã§ã¯ malloc
ãç¨ããã¼ãé åã«ã¡ã¢ãªé åã確ä¿ãã free
ãç¨ãã¦è§£æ¾ãã¦ããã
åã« main
颿°å
ã® loc
ã free
ããã ãã§ã¯ name
ã coords
ãè§£æ¾ãããªããããæç¤ºçã«å
å´ããé ã«è§£æ¾ããå¦çãæ¸ããã¨ã§æ£ããã¡ã¢ãªãè§£æ¾ãããããã«ãã¦ããã
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_LEN 32 typedef struct st_coords { double x; double y; } Coords; typedef struct st_location { char *name; Coords *coords; } Location; Coords *new_coords(double x, double y) { Coords *c = (Coords*) malloc(sizeof(Coords)); c->x = x; c->y = y; return c; } void show_coords(Coords *c) { printf("[%.4f, %.4f]", c->x, c->y); } void drop_coords(Coords *c) { free(c); } Location *new_location(char *name, Coords *coords) { Location *l = (Location*) malloc(sizeof(Location)); l->name = name; l->coords = coords; return l; } void show_location(Location *loc) { printf("%s ", loc->name); show_coords(loc->coords); printf("\n"); } void drop_location(Location *loc) { free(loc->name); drop_coords(loc->coords); free(loc); } void sample_function() { Coords *coords = new_coords(35.6290249, 139.7943864); char *name = (char*) malloc(NAME_LEN); strncpy(name, "Tokyo Big Sight", NAME_LEN-1); Location *loc = new_location(name, coords); show_location(loc); // free(loc); /* ããã ã¨Coordsãè§£æ¾ãããªã */ drop_location(loc); //ãã¡ãã¨æç¤ºçã«å帰çãªè§£æ¾å¦çãè¡ã } int main(void) { sample_function(); return 0; }
Rust
以ä¸ã®Rustã®ã³ã¼ãä¾ã¯æå³çã«Box<T>
ãç¨ãã¦ä¸è¨ã®Cã®ã³ã¼ãã¨ã¡ã¢ãªç¢ºä¿ã®æ§é ãä¸è´ããã¦ããããè§£æ¾å¦çã¯å¤ãææãã¦ãã夿°ãã¹ã³ã¼ããæããã¨ãã«èªåã§è¡ããããããè§£æ¾å¦çãæ
éã«å®è£
ããå¿
è¦ããªããªã£ã¦ããã
use std::fmt; struct Coords { x: f64, y: f64, } impl Coords { fn boxed(x: f64, y: f64) -> Box<Coords> { Box::new(Coords {x,y}) } } impl fmt::Display for Coords { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "[{:.4}, {:.4}]", self.x, self.y) } } struct Location { name: String, coords: Box<Coords>, } impl Location { fn boxed(name: String, coords: Box<Coords>) -> Box<Location> { Box::new(Location{name, coords}) } } impl fmt::Display for Location { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{} {}", self.name, self.coords) } } fn sample_function() { let coords = Coords::boxed(35.6290249, 139.7943864); let name = "Tokyo Big Sight".to_owned(); let loc = Location::boxed(name, coords); println!("{}", loc); // ã¹ã³ã¼ããæãããã¨ã§èªåã§`loc`ãç ´æ£ããããã®ä¸èº«ã§ãã`coords`ã¨`name`ãèªåã§ç ´æ£ããã } fn main() { sample_function() }
ãã®ä¾ã§ã¯ãsample_function
颿°å
ã®loc
夿°ãBox<Location>
åã®å¤ãææãã¦ããããã®Location
åã®å¤ãString
åã®å¤ã¨Box<Coords>
åã®å¤ãææãã¦ããã
ãããã£ã¦ãsample_function
ãæãã¦å¤æ°loc
ãã¹ã³ã¼ããå¤ããæç¹ã§èªåçã«ä»¥ä¸ã®ããã«é çªã«ç ´æ£å¦çãè¡ãããã
loc
ãã¹ã³ã¼ãããå¤ãããããæãBox<Location>
åã®å¤ãç ´æ£å¯¾è±¡ã«ãªãBox<Location>
ã®ä¸èº«ã§ããLocation
åã®å¤ãç ´æ£å¯¾è±¡ã«ãªãLocation
ã®ä¸èº«ã§ããString
åã®å¤ãç ´æ£å¯¾è±¡ã«ãªãString
ã®ä¸èº«ã«ãããã¼ãä¸ã®é å(å®éã®å®è£ ã§ã¯Vec<u8>
)ãè§£æ¾ããã
String
åã®å¤ã®ç ´æ£å¦çãçµããLocation
ã®ä¸èº«ã§ããBox<Coords>
åã®å¤ãç ´æ£å¯¾è±¡ã«ãªãBox<Coords>
ã®ä¸èº«ã§ããCoords
åã®å¤ãç ´æ£å¯¾è±¡ã«ãªãCoords
åã¯ç¹ã«ç ´æ£å¦çããªã
Coords
åã®å¤ã®ç ´æ£å¦çãçµãã
Box<Coords>
åã®å¤ã使ç¨ãã¦ãããã¼ãä¸ã®é åãè§£æ¾ãããBox<Coords>
åã®å¤ã®ç ´æ£å¦çãçµãã
Location
åã®å¤ã®ç ´æ£å¦çãçµãã
Box<Location>
åã®å¤ã使ç¨ãã¦ãããã¼ãä¸ã®é åãè§£æ¾ãããBox<Location>
åã®ç ´æ£å¦çãçµãã
ãã®é çªãè¦ã¦ããã¨ãCè¨èªã®ä¾ã¨åãããã«ã¡ã¢ãªé åãè§£æ¾ãã¦ãããã¨ããããã ãã®èªåçãªç ´æ£å¦çãå®ç¾ããã®ãæææ¨©ã®æ©æ§ã®ä¸»ãªç®çã§ããã
ã¡ãªã¿ã«ãã¡ã¢ãªä¸ã§ã®æ§é ã¯ä»¥ä¸ã®å³ã®ããã«ãªã£ã¦ããã
Ruby
GCãæ¡ç¨ãã¦ããè¨èªã§ã¯ãããã©ã«ãã§å¤ããã¼ãé åã«ç¢ºä¿ããäºãå¤ãã ãã®ãããªè¨èªã§ã¯ãã¹ã¿ãã¯é åã»ãã¼ãé åã»éçé åãªã©ã®ã¡ã¢ãªé åã«é¢ãã¦ã¯è¨èªä»æ§ã§ã¯å®ãããã¦ããªããã¨ãããã ã¤ã¾ããããã°ã©ãã¯ã¡ã¢ãªç®¡çã«é¢ãã¦ã¯ã»ã¨ãã©æ°ã«ãããã¨ã¯ãªãããé¢ä¸ããäºãã§ããªãï¼ãããã¯é£ããï¼ã
ä¸ã®ä¾ã¯Rubyã§æ¸ããã¦ããããRubyã®äºå®ä¸ã®æ¨æºå®è£ ã§ããCRubyã§ã¯åºæ¬çã«ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã¯ãã¼ãé åã«ç¢ºä¿ããããããä¸ã®Cã¨Rustã®ä¾ã¨ä¼¼ããããªã¡ã¢ãªæ§é ã«ãªã£ã¦ãããã¨ãæå¾ ãããã ãã£ã¨ããRubyã«ã¯GCããããããå¤ã®å 鍿§é ã¨ãã¦ã¯CãRustã®ä¾ã«æ¯ã¹ã¦ããè¤éãªãã®ã«ãªã£ã¦ããã ã¾ããå®è¡æã®æé©åãªã©ã§é ç½®ã®ããæ¹ãå¤ããå¯è½æ§ãããã
#! /usr/bin/env ruby class Coords def initialize(x, y) @x = x @y = y end def to_s format('[%.4f, %.4f]', @x, @y) end end class Location def initialize(name, coords) @name = name @coords = coords end def to_s "#{@name} #{@coords}" end end def sample_function coords = Coords.new(35.6290249, 139.7943864) name = 'Tokyo Big Sight' loc = Location.new(name, coords) puts loc # ã¹ã³ã¼ããæãããã¨ã§åç §ãæ¶ãããã®å¾GCã«ãã£ã¦ã¡ã¢ãªé åãååããã end sample_function
以ä¸ã®ã³ã¼ãã§çç®ãã¹ãç¹ã¯ãã¡ã¢ãªç®¡çãè¡ã£ã¦ããé¨åãåå¨ããªããã¨ã§ããã
Coords.new()
ã¯æ°ãã«Coords
ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã使ãã¦ããããããããã¼ãé åã¸ã®ã¡ã¢ãªç¢ºä¿ãä¼´ããã©ããã¨ãã£ãå®è£
ä¸ã®è©³ç´°ã¯å¦çç³»ã«ãã£ã¦é è½ããã¦ããã
ã¾ããã¡ã¢ãªé åã®è§£æ¾ãGCãè¡ãã®ã§ãããã°ã©ã ä¸ã«ã¯ç¾ããªãã
ã¤ã¾ããã¡ã¢ãªç®¡çã¯ã»ã¼å®å
¨ã«ãªãã¸ã§ã¯ãã®çæã¨åç
§ã®æ¶æ»
ã¨ããç°ãªãã¬ã¤ã¤ã¼ã®æ¦å¿µã«æ½è±¡åããã¦ããã
ããããããã°ã©ããã¡ã¢ãªç®¡çããè§£æ¾ãããã¨ããã¡ãªããã¨ãã¦æããããããã°ã©ããã¡ã¢ãªã®ä½¿ç¨æ³ããã¥ã¼ãã³ã°ã§ããªãã¨ãããã¡ãªããã¨ãã¦æãããã¯ãã¢ããªã±ã¼ã·ã§ã³ã®è² è·ã®ç¹æ§ãªã©ã®æèã«ãã£ã¦å¤ãã£ã¦ããã
ãããã«
Rustã®æææ¨©ï¼ownershipï¼ã¯ãå¤ã®ææè ããã ä¸ã¤ã«éå®ãããã®ææè ãå¤ã®ç ´æ£å¦çãè¡ã責任ãæã¤ã¨ããè¦åã§ããã ãã®æææ¨©ã®æ©æ§ã«ãã£ã¦ãGCãæ¡ç¨ããªãã¦ãæ£ããã¡ã¢ãªããã¡ã¤ã«ãã³ãã«ãªã©ã®ãªã½ã¼ã¹ã使ãããªããªã£ã¦ããã«è§£æ¾ãããããã«ãªã£ã¦ãããããã°ã©ããã¡ã¢ãªã®ä½¿ç¨æ³ãå¶å¾¡ã§ããããã«ãã¤ã¤ãå®å ¨ã«ã¡ã¢ãªç®¡çããããããã«ãªã£ã¦ããã
å®éã«Rustã®ã³ã¼ããæ¸ãéãããã®ãã¼ã¿ãä¿æãã¦æå¾ã¾ã§ç®¡çããã®ã¯ã©ã®é¨åã®è²¬ä»»ãã¨ãããã¨ããã¡ãã¨æ¤è¨ãããã¨ã§ãæææ¨©ã«é¢ããéåã«ããã³ã³ãã¤ã«ã¨ã©ã¼ãèµ·ãããªãããã«ãªãã¯ãã§ããã Rustã®ã¡ã¢ãªç®¡çå¨ãã®è©±é¡ã¨ãã¦ã¯ãæææ¨©ã ãã§ã¯ä¸ååã§åç¨ã¨ã©ã¤ãã¿ã¤ã ã¨ãããã®ããããããã®2ã¤ãæææ¨©ã®æ¦å¿µãåæã«ãªã£ã¦ãããããã¾ãã¯æææ¨©ãçè§£ãã¦ããã®ãéè¦ã§ããã¨æãã
ä½è«
ãã®è¨äºãããåããéãããRustã§ã¯ããã°ã©ããã¡ã¢ãªç®¡çã«ã¤ãã¦èããå¿ è¦ã¯ãªããã¨ãã主張ã¯å®å ¨ã«èª¤ãã§ããã
Rustã§ã¯ããã°ã©ããæç¤ºçã«ã¡ã¢ãªã®è§£æ¾å¦çãæ¸ãããã§ã¯ãªãããã¡ã¢ãªãã©ãã§ã©ã使ã£ã¦ãã¤è§£æ¾ãããã¨ããã¡ã¢ãªç®¡çã¯åå¨ããã å ·ä½çã«ã¯ã¡ã¢ãªç®¡çã¯ãã¼ã¿æ§é ã颿°ã®å¼æ°ã§æææ¨©ãåããåç¨ãããã¨ãã£ãæææ¨©å¨ãã®è¨è¨ã«ç¾ããã ãããããããã¦GCãæ¡ç¨ãã¦ããªãã®ã¯ãããã°ã©ããã¡ã¢ãªç®¡çãè¡ãã¤ã¤ãå®å ¨ãªã³ã¼ããæ¸ããããã«ãããã¨ãRustã®å¤§ããªç®æ¨ã®ä¸ã¤ã ããã§ããã
䏿¹ã§ããRustã§ã¯ããã°ã©ããã¡ã¢ãªç®¡çãå£ãã¦ãããã©ãããèããå¿
è¦ã¯ãªããã¨ãã主張ã¯ã»ã¼æ£ããã
unsafeãªæ©è½ãæ£ãã使ããªãã£ãå ´åã«æªå®ç¾©åä½ãèµ·ãããããRc
ã¨RefCell
ãçµã¿åããã¦ã¡ã¢ãªãªã¼ã¯ãèµ·ãããããããã¨ã¯ã§ããããæ®éã«å®è£
ãã¦ããéãããããåé¡ã«ãªããã¨ã¯ã¾ããªãã
Rustã¯CãC++ãªã©ã¨ã¯éã£ã¦ããã°ã©ããä¿¡ç¨ããªããããã³ã³ãã¤ã©ãæ£ãããã¨ã示ããªãã³ã¼ãã¯å®¹èµ¦ãªãã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªããã¡ã¢ãªç®¡çå¨ãã§ã»ãã¥ãªãã£ãªã©ã«åé¡ãããããã°ã©ã ããªãªã¼ã¹ãã¦ãã¾ãå¯è½æ§ã¯ããªãå°ãããªãã
çãããå®å¿ãã¦ã³ã³ãã¤ã«ã¨ã©ã¼ãåºãã¦ãã£ã¦ã»ããã