çŸåšãCèšèªã§éçºãããŠãããããžã§ã¯ãããRustã«ç§»è¡ããã±ãŒã¹ãå¢ããŠããŸããRustã¯ãCèšèªã«æ¯ã¹ãŠå®å šæ§ãé«ããã¡ã¢ãªç®¡çãèªååãããŠãããããéçºè ã«ãšã£ãŠé åçãªéžæè¢ãšãªã£ãŠããŸãããšã¯èšããCèšèªã§ç°¡åã«æžããåŠçãRustã§ãšãŠãè€éã«ãªããšããå Žé¢ããããŸããä»åã¯ããã®ä»£è¡šäŸãšããŠãåæ¹åãªã¹ãã®å®è£ ãCèšèªãšRustã§æ¯èŒããŠã¿ãŸãããã
Rustã®å®å šæ§ã¯æææš©ã·ã¹ãã ã«ãã
Rustã®å®å šæ§ã¯ãæææš©ã·ã¹ãã ã«åºã¥ããŠããŸããæææš©ã·ã¹ãã ã¯ãã¡ã¢ãªç®¡çãèªååããããŒã¿ç«¶åãã¡ã¢ãªãªãŒã¯ãªã©ã®åé¡ã鲿¢ããŸããCèšèªã§ã¯ãéçºè ãæåã§ã¡ã¢ãªç®¡çãè¡ãå¿ èŠãããããããã¡ã¢ãªãªãŒã¯ãªã©ãã°ã®åå ãšãªãããšããããŸãã
ããã«Rustã®å®å šæ§ãéç«ãããŠããã®ãããã€ã³ã¿ã®äœ¿çšãå¶éããŠããç¹ã§ããRustã§ã¯ããã€ã³ã¿ã®ä»£ããã«åç §ãã¹ããŒããã€ã³ã¿ã䜿çšããŸããããã«ãããããŒã¿ã®æææš©ãšã©ã€ãã¿ã€ã ãæç¢ºã«ãªããå®å šãªã³ãŒããæžãããšãã§ããŸãã
ãšã¯èšãããã€ã³ã¿ã䜿ãã°ç°¡åã«æžããåŠçããRustã§ã¯è€éã«ãªãããšããããŸããäŸãã°ãåæ¹åãªã¹ãã®å®è£ ã¯ãCèšèªã§ã¯éåžžã«ã·ã³ãã«ã§ãããRustã§ã¯æææš©ãšåçšã®ã«ãŒã«ãèæ ®ããå¿ èŠããããŸããããã§ãä»åã¯ãCèšèªãšRustãæ¯èŒããŠã¿ãŸãã
åæ¹åãªã¹ããšã¯
åæ¹åãªã¹ããšã¯ãåããŒããæ¬¡ã®ããŒããžã®ãã€ã³ã¿ãæã€ããŒã¿æ§é ã§ãããªã¹ãã®æåŸã®ããŒãã¯ã次ã®ããŒããžã®ãã€ã³ã¿ãNULLã«ãªããŸããåæ¹åãªã¹ãã¯ãåçãªããŒã¿æ§é ã§ãããèŠçŽ ã®è¿œå ãåé€ã容æã«è¡ãããããæ§ã ãªå Žé¢ã§äœ¿çšãããŸããæ¬¡ã®ãããªæ§é ã«ãªã£ãŠããŸãã
åæ¹åãªã¹ãã衚çŸããæ§é äœã®å®çŸ©
Cèšèªã§åæ¹åãªã¹ããå®è£ ããå Žåãæ¬¡ã®ãããªæ§é äœãå®çŸ©ããŠãããŠããã®æ§é äœãè€æ°çæãããã€ã³ã¿ã®nextããæ¬¡ã®ããŒããæãããã«ããŸãã
typedef struct Node {
char *value;
struct Node *next;
} Node;
Rustã§ãåæ§ã®æ§é äœãå®çŸ©ããããšãã§ããŸãããæææš©ãšåçšã®ã«ãŒã«ãèæ ®ããå¿ èŠããããŸããRustã§ã¯ã次ã®ããã«å®çŸ©ããŸãã
#[derive(Debug)]
struct Node {
value: String,
next: Option<Box<Node>>,
}
Cèšèªãšæ¯ã¹ããšãRustã®æ¹ãè€éã«èŠããŸããOptionãšã¯ãå€ãååšãããã©ããã衚ãåæåã§ãBoxã¯ããŒãäžã«ããŒã¿ãæ ŒçŽããããã®ã¹ããŒããã€ã³ã¿ã§ããRustã§ã¯ãæææš©ãšåçšã®ã«ãŒã«ãèæ ®ããå¿ èŠããããããåæ¹åãªã¹ãã®å®è£ ã¯Cèšèªãããè€éã«ãªããŸãã
ãšèšãã®ããRustã®ããã°ã©ãã³ã°ã§ã¯ãã¡ã¢ãªã®é çœ®å Žæã§ããã¹ã¿ãã¯ãšããŒãã®éãããããæèããå¿ èŠããããŸãããããŠãRustã®ããã°ã©ã ãã³ã³ãã€ã«ããæã«ãåã®ãµã€ãºã確å®ããŠããå¿ èŠããããŸããåæ¹åãªã¹ãã®ãããªååž°çãªããŒã¿æ§é ã¯ãåã®ãµã€ãºãèšç®ãããšãã«ãç¡éã«ãªã£ãŠããŸãã®ã§ããããã§ã鿥åç §ïŒBoxãªã©ïŒã䜿ã£ãŠãµã€ãºãåºå®åããå¿ èŠããããŸãã
äŸãã°ãRustã§æ¬¡ã®ãããªæ§é äœãå®çŸ©ãããšãã³ã³ãã€ã«ãšã©ãŒã«ãªããŸãã
struct Node {
value: String,
next: Option<Node>, // â ããã¯ã³ã³ãã€ã«ãšã©ãŒã«ãªã
}
ã©ã®ãããªæ©èœãå®è£ ããã®ãèããã
æåã«ã©ã®ãããªæ©èœãå®è£ ããã®ãèããŸããããããã§ã¯ãæãç°¡åãªéšåãšããŠããªã¹ãã«èŠçŽ ã远å ããŠãæåŸã«ãªã¹ãã®äžèЧã衚瀺ãããšããæ©èœãå®è£ ããŸãã
Cèšèªã§ä»¥äžã®ãããªã¡ã€ã³é¢æ°ãå®è£ ãããã®ãšããŸããããã§ãå®è£ ããã®ã¯ãããŒã¿ã远å ããpush_data颿°ãšããªã¹ãã®äžèЧã衚瀺ããprint_list颿°ããããŠæåŸã«ã¡ã¢ãªãè§£æŸããfree_list颿°ã§ãã
int main(void) {
Node *head = NULL; // æåã®NodeèŠçŽ ãæããã€ã³ã¿
// ããŒã¿ã®è¿œå
push_data(&head, "ããã");
push_data(&head, "ã¿ãã");
push_data(&head, "ããã");
// ãªã¹ãã®äžèЧã衚瀺
print_list(head);
// ã¡ã¢ãªã®è§£æŸ
free_list(&head);
return 0;
}
Cèšèªã§åæ¹åãªã¹ããå®è£ ããŠã¿ãã
æåã«ãCèšèªã§åæ¹åãªã¹ããå®è£ ãããšæ¬¡ã®ããã«ãªããŸãã以äžã¯ããªã¹ãã远å ããpush_data颿°ã®å®è£ äŸã§ããpush_data颿°ãå®è£ ããããã«ãæååãã³ããŒããclone_str颿°ãããŒããäœæããcreate_node颿°ããããŠãªã¹ãã®æ«å°Ÿã«æååã远å ããpush_data颿°ãå®è£ ããŸãã
// æååãã³ããŒãã颿° --- (*2)
char *clone_str(const char *src) {
size_t len = strlen(src) + 1;
char *dest = (char *)malloc(len);
if (dest == NULL) {
fprintf(stderr, "ã¡ã¢ãªç¢ºä¿ã«å€±æããŸããã\n");
exit(EXIT_FAILURE);
}
memcpy(dest, src, len);
return dest;
}
// ããŒããäœæãã颿° --- (*3)
Node *create_node(const char *value) {
Node *node = (Node *)malloc(sizeof(Node));
if (node == NULL) {
fprintf(stderr, "ã¡ã¢ãªç¢ºä¿ã«å€±æããŸããã\n");
exit(EXIT_FAILURE);
}
node->value = clone_str(value);
node->next = NULL;
return node;
}
// ãªã¹ãã®æ«å°Ÿã«æååã远å ãã颿° --- (*4)
void push_data(Node **head, const char *value) {
Node *node = create_node(value);
if (*head == NULL) {
*head = node;
return;
}
// ãªã¹ãã®æ«å°Ÿã®ããŒããæ¢ã
Node *current = *head;
while (current->next != NULL) {
current = current->next;
}
// ãªã¹ãã«ããŒããã€ãªãã
current->next = node;
}
ããã°ã©ã ã確èªããŠã¿ãŸãããã(ïŒ2)ã§ã¯ãæååãã³ããŒããããã®é¢æ°ãå®è£ ããŠããŸããCèšèªã§ã¯ãmalloc颿°ã䜿çšããŠã¡ã¢ãªã確ä¿ããmemcpy颿°ã䜿çšããŠæååãã³ããŒããŸãã
(ïŒ3)ã§ã¯ãããŒããäœæããããã®é¢æ°ãå®è£ ããŠããŸããæ§é äœã®Nodeãäœæããå Žåããmalloc颿°ã䜿çšããŠã¡ã¢ãªã確ä¿ããŸãããã®æãããŒãã®å€ãèšé²ããvalueãã£ãŒã«ãã«ãclone_str颿°ã䜿çšããŠæååãã³ããŒããå€ãèšå®ããŸãã
(ïŒ4)ã§ã¯ããªã¹ãã®æ«å°Ÿã«æååã远å ããããã®é¢æ°ãå®è£ ããŠããŸããåæ¹åãªã¹ãã§ã¯ã次ã衚ãnextãã£ãŒã«ããé ã«ãã©ã£ãŠããªã¹ãã®æ«å°ŸãèŠã€ããŸãããããŠãæ«å°Ÿã®ããŒãã®nextãã£ãŒã«ãã«ãæ°ããããŒããã€ãªããŸãã
ãããŠããªã¹ãã®äžèЧã衚瀺ããprint_list颿°ãšãã¡ã¢ãªãè§£æŸããfree_list颿°ã¯ã次ã®ããã«å®è£ ã§ããŸãã
// ãªã¹ãã®äžèЧã衚瀺ãã颿° --- (*5)
void print_list(const Node *head) {
const Node *current = head;
while (current != NULL) {
printf("- %s\n", current->value);
current = current->next;
}
}
// ãªã¹ãã®ã¡ã¢ãªãè§£æŸãã颿° --- (*6)
void free_list(Node **head) {
Node *current = *head;
while (current != NULL) {
Node *next = current->next;
free(current->value);
free(current);
current = next;
}
*head = NULL;
}
ããã°ã©ã ã確èªããŸãããã(ïŒ5)ã§ã¯ããªã¹ãã®äžèЧã衚瀺ããããã®é¢æ°ãå®è£ ããŠããŸããäžèЧã衚瀺ããã«ã¯ãå é ãããªã¹ãã®æ«å°Ÿã«åãã£ãŠã次ã衚ãnextãã£ãŒã«ããé ã«ãã©ã£ãŠããããšã§ããªã¹ãã®å šãŠã®ããŒãã衚瀺ã§ããŸããå€ã远å ããæã«ãæ«å°Ÿã®ããŒããæ¢ãã®ãšåãèŠé ã§ãã
(ïŒ6)ã§ã¯ããªã¹ãã®ã¡ã¢ãªãè§£æŸããããã®é¢æ°ãå®è£ ããŠããŸããCèšèªã§ã¯ã確ä¿ããã¡ã¢ãªã¯èªèº«ã§è§£æŸããå¿ èŠããããŸããä»åã¯æååãå å ããããŒããmalloc颿°ã§ç¢ºä¿ããŠããã®ã§ãfree颿°ã§æåã«ããŒãã®valueãã£ãŒã«ããè§£æŸãããã®åŸã«ããŒãèªäœãè§£æŸããŸãã
ãã®ããã°ã©ã ã®å šäœã¯ããã¡ãã«ã¢ããããŒãããŸããããã¡ã€ã«ããlist.cããšããååã§ä¿åããããæ¬¡ã®ããã«ããŠã³ã³ãã€ã«ããŠå®è¡ã§ããŸãã以äžã¯ãGCCã䜿çšããŠã³ã³ãã€ã«ããŠå®è¡ããäŸã§ãã
$ gcc list.c -o list
./list
- ããã
- ã¿ãã
- ããã
Rustã§åæ¹åãªã¹ããå®è£ ããŠã¿ãã
ç¶ããŠãRustã§åæ¹åãªã¹ããå®è£ ããŠã¿ãŸããããCèšèªãšåæ§ã«ããªã¹ãã«èŠçŽ ã远å ããŠãæåŸã«ãªã¹ãã®äžèЧã衚瀺ãããšããæ©èœãå®è£ ããŸããRustã§ã¯ã次ã®ããã«å®è£ ã§ããŸããæåã«ããªã¹ãã远å ããpush_data颿°ã®å®è£ äŸã瀺ããŸããããã°ã©ã äžã«å ¥ãã(ïŒçªå·)ã®ãããªçªå·ã¯ãCèšèªã®å®è£ ãšå¯Ÿå¿ãããŠããŸãã
// åæ¹åãªã¹ãã®ããŒãæ§é äœ --- (*1)
#[derive(Debug)]
struct Node {
value: String,
next: Option<Box<Node>>,
}
impl Node {
// ããŒããäœæãã颿° --- (*3)
fn new(value: &str) -> Self {
Node {
value: value.to_string(), // --- (*2)
next: None,
}
}
}
// ãªã¹ãã®æ«å°Ÿã«æååã远å ãã颿° --- (*4)
fn push_data(head: &mut Option<Box<Node>>, value: &str) {
if head.is_none() {
*head = Some(Box::new(Node::new(value)));
} else {
// ãªã¹ãã®æ«å°Ÿã®ããŒããæ¢ã
let mut current = head.as_mut().unwrap();
loop {
if current.next.is_none() {
current.next = Some(Box::new(Node::new(value)));
break;
} else {
current = current.next.as_mut().unwrap();
}
}
}
}
確èªããŠã¿ãŸãããã(ïŒ1)ã§ã¯ãåæ¹åãªã¹ãã®ããŒãæ§é äœãå®çŸ©ããŠããŸããCèšèªãšåæ§ã«ãvalueãã£ãŒã«ãã«ã¯æååãæ ŒçŽããnextãã£ãŒã«ãã«ã¯æ¬¡ã®ããŒããžã®åç
§ãæ ŒçŽããŸããRustã§ã¯ãæææš©ãšåçšã®ã«ãŒã«ãèæ
®ããå¿
èŠããããããnextãã£ãŒã«ãã¯Option
(ïŒ2)ã§ã¯ãæååãã³ããŒããããã®é¢æ°ãå®è£ ããŠããŸããRustã§ã¯ãto_stringã¡ãœããã䜿çšããŠæååãã³ããŒããŸãã
(ïŒ3)ã§ã¯ãããŒããäœæããããã®é¢æ°ãå®è£ ããŠããŸããNodeæ§é äœã®new颿°ã¯ãåŒæ°ãšããŠæååãåãåããæ°ããããŒããäœæããŠè¿ããŸãã
(ïŒ4)ã§ã¯ããªã¹ãã®æ«å°Ÿã«æååã远å ããããã®é¢æ°ãå®è£ ããŠããŸããRustã§ã¯ãOptionåã®is_noneã¡ãœããã䜿çšããŠãªã¹ãã空ãã©ããã確èªãã空ã®å Žåã¯æ°ããããŒããäœæããŠheadã«èšå®ããŸãããªã¹ãã空ã§ãªãå Žåã¯ãnextãã£ãŒã«ããé ã«ãã©ã£ãŠãªã¹ãã®æ«å°ŸãèŠã€ããæ°ããããŒãã远å ããŸãã
ãããŠãloopã䜿çšããŠãªã¹ãã®æ«å°Ÿãæ¢ãéšåã¯ãCèšèªã®å®è£ ãšåæ§ã®ããžãã¯ã§ãããRustã§ã¯Optionåã®as_mutã¡ãœããã䜿çšããŠå¯å€åç §ãååŸããŠããŸãããããŠãnextãã£ãŒã«ããNoneã§ãããã©ããã確èªããNoneã§ããã°æ°ããããŒãã远å ããããã§ãªããã°æ¬¡ã®ããŒãã«ç§»åããŸãã
ç¶ããŠããªã¹ãã®äžèЧã衚瀺ããprint_list颿°ãšã¡ã€ã³é¢æ°ã¯ã次ã®ããã«å®è£ ã§ããŸãã
// ãªã¹ãã®äžèЧã衚瀺ãã颿° --- (*5)
fn print_list(head: &Option<Box<Node>>) {
let mut current = head.as_ref();
while let Some(node) = current {
println!("- {}", node.value);
current = node.next.as_ref();
}
}
// ã¡ã€ã³é¢æ° --- (*7)
fn main() {
let mut head: Option<Box<Node>> = None;
// ããŒã¿ã®è¿œå
push_data(&mut head, "ããã");
push_data(&mut head, "ã¿ãã");
push_data(&mut head, "ããã");
// ãªã¹ãã®äžèЧã衚瀺
print_list(&head);
// Rustã§ã¯èªåçã«ã¡ã¢ãªãè§£æŸãããïŒDrop traitã«ããïŒ
}
ããã°ã©ã ã確èªããŸãããã(ïŒ5)ã§ã¯ããªã¹ãã®äžèЧã衚瀺ããããã®é¢æ°ãå®è£ ããŠããŸããRustã§ã¯ãwhile letæ§æã䜿çšããŠOptionåã®å€ãåŠçããŸããcurrent倿°ã¯ããªã¹ãã®çŸåšã®ããŒããžã®åç §ãä¿æããŸããcurrentãSome(node)ã§ããéããããŒãã®å€ã衚瀺ããæ¬¡ã®ããŒãã«ç§»åããŸãã
(ïŒ7)ã§ã¯ãã¡ã€ã³é¢æ°ãå®è£ ããŠããŸããCèšèªãšåæ§ã«ãæåã«head倿°ãNoneã§åæåããpush_data颿°ã䜿çšããŠãªã¹ãã«èŠçŽ ã远å ããŸãããããŠãprint_list颿°ãåŒã³åºããŠãªã¹ãã®äžèЧã衚瀺ããŸãã
ãªããã¡ã¢ãªãè§£æŸãã(ïŒ6)ã®åŠçãçç¥ãããŠããŸãããRustã§ã¯ãæææš©ãšåçšã®ã«ãŒã«ã«ãããã¡ã¢ãªç®¡çãèªååãããŠãããããæç€ºçã«ã¡ã¢ãªãè§£æŸããå¿ èŠã¯ãããŸããã
äžèšã®ããã°ã©ã ããã¡ãã«ã¢ããããŒãããŸããã
æåã«ãCargoã䜿çšããŠæ°ãããããžã§ã¯ããäœæããŸãã
$ mkdir rust_list
$ cd rust_list
$ cargo init
ãããŠãäžèšã®ããã°ã©ã ãã/rust_list/src/main.rsãã«èšè¿°ããŸãããããŠã次ã®ããã«ã³ã³ãã€ã«ããŠå®è¡ã§ããŸãã
$ cargo run
- ããã
- ã¿ãã
- ããã
RustãããVecã䜿ã£ãŠæååãªã¹ããå©çšããã
ãªããRustã§ã¯ãåæ¹åãªã¹ãã®ãããªããŒã¿æ§é ãèªåã§å®è£ ããããšã¯ããŸãäžè¬çã§ã¯ãããŸãããRustã®æšæºã©ã€ãã©ãªã«ã¯ãVecãšããåçé åãçšæãããŠãããããã䜿çšããããšã§ãããç°¡åã«æååã®ãªã¹ãã管çã§ããããã§ãã
Vecã¯ãèŠçŽ ã®è¿œå ãåé€ã容æã§ãããã¡ã¢ãªç®¡çãèªååãããŠãããããRustãããã³ãŒããæžãããšãã§ããŸããäžèšã®åæ¹åãªã¹ãã®äŸãVecã䜿çšããŠæžãæãããšã次ã®ããã«ãªããŸãã
fn main() {
// ãªã¹ããäœæ
let mut list: Vec<String> = Vec::new();
// ããŒã¿ã®è¿œå
list.push("ããã".to_string());
list.push("ã¿ãã".to_string());
list.push("ããã".to_string());
// ãªã¹ãã®äžèЧã衚瀺
for item in &list {
println!("- {}", item);
}
}
ãã®ããã«ãæšæºã©ã€ãã©ãªã®Vecã䜿çšããããšã§ãåæ¹åãªã¹ãã®ãããªããŒã¿æ§é ãèªåã§å®è£ ããå¿ èŠããªããªããŸããç¹ã«ãVecãå©çšãããšãé£ç¶ããã¡ã¢ãªã«èŠçŽ ãæ ŒçŽãããããããã£ãã·ã¥å¹çãåäžããããã©ãŒãã³ã¹ãåäžããŸãã
ã€ãŸããCèšèªã®ã³ãŒããRustã«ç§»è¡ããéã«ã¯ãåçŽã«Cèšèªã®ã³ãŒããRustã«æžãæããã®ã§ã¯ãªããRustã®ç¹åŸŽã掻ãããã³ãŒããæžãããšãéèŠã§ããRustã®æææš©ã·ã¹ãã ãæšæºã©ã€ãã©ãªã掻çšããããšã§ãããå®å šã§å¹ççãªã³ãŒããæžãããšãã§ããŸãã
ãŸãšã
以äžãCèšèªãšRustãæ¯èŒããŠãåæ¹åãªã¹ãã®å®è£ ãéããŠãRustã®æææš©ã·ã¹ãã ãæšæºã©ã€ãã©ãªã®æŽ»ç𿹿³ã«ã€ããŠèª¬æããŸãããRustã¯ãCèšèªã«æ¯ã¹ãŠå®å šæ§ãé«ããã¡ã¢ãªç®¡çãèªååãããŠãããããéçºè ã«ãšã£ãŠé åçãªéžæè¢ãšãªã£ãŠããŸãã
ããããä»åèŠãããã«Cèšèªã®åŠçããã®ãŸãŸRustã«1:1ã§ç¿»èš³ããããã«å®è£ ãããªããéã«è€éã«ãªã£ãŠããŸãå Žé¢ããããŸããRustã®ç¹åŸŽãçè§£ããé©åãªããŒã¿æ§é ãæ©èœãéžæããããšã§ãããå®å šã§å¹ççãªã³ãŒããæžãããšãã§ããŸããRustã¯ãCèšèªããã®ç§»è¡ã«ãããŠãåçŽãªã³ãŒãã®æžãæãã§ã¯ãªããRustã®ç¹åŸŽã掻ãããã³ãŒããæžãããšã§ãããè¯ãçµæãåŸãããšãã§ããã§ãããã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ããããŸã§50å以äžã®æè¡æžãå·çãããçŽè¿ã§ã¯ããå€§èŠæš¡èšèªã¢ãã«ã䜿ãããªãããã®ããã³ãããšã³ãžãã¢ãªã³ã°ã®æç§æž(ãã€ããåºç)ããPythonã§ã€ãããã¹ã¯ãããã¢ããª(ãœã·ã )ããå®è·µåã身ã«ã€ãã Pythonã®æç§æž 第2çããã·ãŽããã¯ãã©ã PythonèªååŠçã®æç§æž(ãã€ããåºç)ããªã©ã

