Rustæææš©ãšåçšã培åºè§£èª¬ -- ã¡ã¢ãªå®å šæ§ã®ä»çµã¿ãšå®è·µãã¿ãŒã³
Rustã®æææš©ãåçšãã©ã€ãã¿ã€ã ã®ä»çµã¿ãã³ãŒãäŸãšãšãã«è©³ãã解説ããŸãããããŒãã§ãã«ãŒã®ãšã©ãŒå¯ŸåŠæ³ãå®åã§äœ¿ãããã¿ãŒã³ã玹ä»ããŸãã

Rustã®æææš©ãšåçšã¯ãRustãæäŸããã¡ã¢ãªå®å šæ§ä¿èšŒã®åºç€ãšãªãä»çµã¿ã§ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæ¡çšããèšèªãšã¯ç°ãªããRustã¯ã³ã³ãã€ã«æã«ãããŒãã§ãã«ãŒãéããŠå³æ Œãªã«ãŒã«ãé©çšããŸããããã«ããããã«ãã€ã³ã¿åç §ãããŒã¿ç«¶åãè§£æŸåŸäœ¿çšïŒuse-after-freeïŒãšãã£ããã°ã®çºçããã©ã³ã¿ã€ã ãªãŒããŒããããªãã§æé€ã§ããŸãã
ã·ã¹ãã ããã°ã©ãã³ã°ã®é¢æ¥ã§ã¯ãæææš©ãšåçšã®çè§£ãå¿ é ã¹ãã«ãšããŠåãããŸããæ¬èšäºã§ã¯ãã ãŒãã»ãã³ãã£ã¯ã¹ããåçšã«ãŒã«ãã©ã€ãã¿ã€ã ã®æ³šéãŸã§ãå ·äœçãªã³ãŒãäŸãçšããŠäœç³»çã«è§£èª¬ããŸãã
Every value in Rust has exactly one owner. When the owner goes out of scope, the value is dropped. Ownership can be transferred (moved) or temporarily lent (borrowed). These three rules replace garbage collection entirely.
ã ãŒãã»ãã³ãã£ã¯ã¹ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã眮ãæããä»çµã¿
å€ãã®ããã°ã©ãã³ã°èšèªã§ã¯ãè€æ°ã®å€æ°ãããŒãäžã®åäžããŒã¿ãåç §ã§ããŸããRustã¯ç°ãªãã¢ãããŒããæ¡çšããŠããŸããããŒãäžã®å€ãå¥ã®å€æ°ã«ä»£å ¥ãããšãæææš©ã**ç§»åïŒã ãŒãïŒ**ããå ã®å€æ°ã¯ç¡å¹åãããŸããã³ã³ãã€ã©ã¯ãã®ã«ãŒã«ããŒãã³ã¹ãã§åŒ·å¶ããŸãã
fn main() {
let original = String::from("interview prep");
let moved = original; // ownership transfers here
// println!("{}", original); // compile error: value moved
println!("{}", moved); // works fine
}ãã®ä»çµã¿ã«ãããããã«ããªãŒã®ãã°ã鲿¢ãããŸããStringåã¯ããŒãäžã«ã¡ã¢ãªã確ä¿ãããããRustã¯ãã®å²ãåœãŠãææãã倿°ãåžžã«1ã€ã ãã§ããããšãä¿èšŒããŸããäžæ¹ãi32ãboolã®ãããªã¹ã¿ãã¯å°çšã®åã¯Copyãã¬ã€ããå®è£
ããŠãããã ãŒãã§ã¯ãªãè€è£œãããŸãã
fn main() {
let x: i32 = 42;
let y = x; // copy, not move -- i32 is Copy
println!("x = {}, y = {}", x, y); // both valid
let s1 = String::from("hello");
let s2 = s1.clone(); // explicit deep copy
println!("s1 = {}, s2 = {}", s1, s2); // both valid after clone
}CopyãšCloneã®éãã¯é¢æ¥ã§é »ç¹ã«åããããã€ã³ãã§ããCopyã¯æé»çãã€äœã³ã¹ãïŒãããåäœã®ã³ããŒïŒã§ããã®ã«å¯ŸããCloneã¯æç€ºçã§ãããŒãå²ãåœãŠã䌎ãããé«ã³ã¹ãã«ãªãåŸãŸãããã®åºå¥ãæ£ç¢ºã«èª¬æã§ããããšããRustã®åºç€çè§£ã瀺ãéèŠãªææšãšãªããŸãã
äžå€åç §ã«ããåçš
æææš©ã®ç§»åãããããå Žé¢ã§è¡ããšãã³ãŒããéå®çšçã«ãªããŸããRustã®åçšæ©èœã¯ãæææš©ãç§»åãããã«å€ãžã®ã¢ã¯ã»ã¹ãäžæçã«è²žãåºãããšã§ããã®åé¡ã解決ããŸããäžå€åç
§ïŒ&TïŒã¯èªã¿åãå°çšã®ã¢ã¯ã»ã¹ãèš±å¯ããè€æ°ã®äžå€åç
§ãåæã«ååšã§ããŸãã
fn calculate_length(s: &String) -> usize {
s.len() // read access through the reference
} // s goes out of scope, but doesn't drop the String (not the owner)
fn main() {
let greeting = String::from("hello, Rust");
let len = calculate_length(&greeting); // borrow, don't move
println!("'{}' has {} characters", greeting, len); // greeting still valid
}&èšå·ã¯å€ãåçšããåç
§ãäœæããŸãã颿°ã·ã°ããã£ã®&Stringã¯ãcalculate_lengthãæææš©ãååŸããã«åçšããããšã宣èšããŠããŸãã颿°ãè¿ã£ãåŸããåŒã³åºãå
ã¯å®å
šãªæææš©ãä¿æããŸãã
ãã®ãã¿ãŒã³ã¯ã颿°éã§ããŒã¿ãåãæž¡ãéã®åºæ¬çãªææ³ã§ããæææš©ãç§»åããå¿ èŠããªãå Žåã¯ãåžžã«åçšãåªå ããã®ãRustã®æ £çšçãªã¹ã¿ã€ã«ãšãªããŸãã
At any given time, a value can have either: many immutable references (&T), OR exactly one mutable reference (&mut T). Never both simultaneously. This rule prevents data races at compile time.
å¯å€åç §ãšæä»æ§ã«ãŒã«
å¯å€åç
§ïŒ&mut TïŒã¯æžã蟌ã¿ã¢ã¯ã»ã¹ãä»äžããŸãããæä»æ§ã匷å¶ããŸããããã¹ã³ãŒãå
ã§ãããå€ã«å¯Ÿããå¯å€åç
§ã¯1ã€ããååšã§ããŸããããã®å¶çŽã«ããã2ã€ã®ã³ãŒããåæã«åãããŒã¿ã倿Žããããšã鲿¢ãããŸãã
fn append_greeting(s: &mut String) {
s.push_str(", welcome to Rust!"); // modify through mutable ref
}
fn main() {
let mut message = String::from("Hello");
append_greeting(&mut message);
println!("{}", message); // "Hello, welcome to Rust!"
}mutããŒã¯ãŒãã¯3ç®æã«èšè¿°ããå¿
èŠããããŸãã倿°æçžïŒlet mutïŒãåç
§åïŒ&mutïŒããããŠé¢æ°ãã©ã¡ãŒã¿ã§ãã3ã€ãã¹ãŠãæã£ãŠããªããšã³ã³ãã€ã«ãšã©ãŒã«ãªããŸããåãã¹ã³ãŒãå
ã§2ã€ç®ã®å¯å€åç
§ãäœæããããšãããšãã³ã³ãã€ã©ããšã©ãŒãå ±åããŸãã
fn main() {
let mut data = String::from("shared state");
let r1 = &mut data;
// let r2 = &mut data; // compile error: second mutable borrow
println!("{}", r1);
// After r1's last usage, a new mutable borrow is allowed
let r3 = &mut data; // this works -- non-lexical lifetimes
r3.push_str(" updated");
println!("{}", r3);
}Rust 2021ãšãã£ã·ã§ã³ã§ã¯ãéã¬ãã·ã«ã«ã©ã€ãã¿ã€ã ïŒNLLïŒãæ¡çšãããŠããŸããåçšã¯ãã¹ã³ãŒããããã¯ã®çµç«¯ã§ã¯ãªããæåŸã«äœ¿çšãããæç¹ã§çµäºããŸããããã«ãããå®å šæ§ãç ç²ã«ããããšãªããæä»æ§ã«ãŒã«ãããæ±ãããããªã£ãŠããŸãã
NLLã®å°å ¥ã«ããã以åã¯ã³ã³ãã€ã«ãšã©ãŒãšãªã£ãŠããå€ãã®æ£åœãªã³ãŒããã¿ãŒã³ãåãå ¥ããããããã«ãªããŸããããããŒãã§ãã«ãŒã®æ¯ãèããçè§£ããäžã§ããã®ä»çµã¿ã®ææ¡ã¯æ¬ ãããŸããã
Rustã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
ã©ã€ãã¿ã€ã ïŒåç §ã®æå¹æéãã³ã³ãã€ã©ã«äŒãã
ã©ã€ãã¿ã€ã ã¯ãåç §ãæã瀺ãããŒã¿ãããé·ãçåããªãããšãä¿èšŒããRustã®ä»çµã¿ã§ããå€ãã®å Žåãã³ã³ãã€ã©ã¯ã©ã€ãã¿ã€ã çç¥èŠåã«ãã£ãŠèªåçã«ã©ã€ãã¿ã€ã ãæšè«ããŸããè€æ°ã®åç §ãçžäºäœçšããå Žåã«ãæç€ºçãªæ³šéãå¿ èŠãšãªããŸãã
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let result;
let string1 = String::from("Rust ownership");
{
let string2 = String::from("borrowing");
result = longest(string1.as_str(), string2.as_str());
println!("Longest: {}", result);
}
}'aæ§æã¯ã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ã§ãããæ°ããæŠå¿µã§ã¯ãªããæ¢ã«ååšããé¢ä¿æ§ã泚éãããã®ã§ãããã®é¢æ°ã·ã°ããã£ã¯ãåºåã®åç
§ã¯ããããã®å
¥ååç
§ãããé·ãçåã§ããªãããšããããšã衚çŸããŠããŸããã³ã³ãã€ã©ã¯ãã®æ
å ±ã䜿ã£ãŠããã³ã°ãªã³ã°åç
§ã鲿¢ããŸãã
ã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ã¯å¶çŽããäœæãããã®ã§ã¯ãªããã³ãŒãã«æ¢ã«ååšããå¶çŽããèšè¿°ããããšããç¹ãéèŠã§ãããã®çè§£ããã©ã€ãã¿ã€ã ã«é¢ããæ··ä¹±ãè§£æ¶ããéµãšãªããŸãã
æ§é äœã®åçšãšã©ã€ãã¿ã€ã å¢ç
åç §ãä¿æããæ§é äœã¯ãã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ã宣èšããå¿ èŠããããŸããããã«ãããæ§é äœãåç §å ã®ããŒã¿ãããé·ãçåã§ããªãããšãä¿èšŒãããŸããC/C++ã§ã¯ãã³ã°ãªã³ã°ãã€ã³ã¿ã®äžè¬çãªåå ãšãªãåé¡ã§ãããRustã§ã¯ã³ã³ãã€ã«æã«é²æ¢ãããŸãã
struct Excerpt<'a> {
text: &'a str,
}
impl<'a> Excerpt<'a> {
fn summary(&self) -> &str {
let end = self.text.len().min(20);
&self.text[..end]
}
}
fn main() {
let article = String::from("Rust ownership model eliminates memory bugs");
let excerpt = Excerpt {
text: article.as_str(),
};
println!("Summary: {}", excerpt.summary());
}Excerpt<'a>ã®ã©ã€ãã¿ã€ã 'aã¯ãæ§é äœã®æå¹æ§ãåºãšãªãæååã«çŽä»ããŠããŸããexcerptãããå
ã«articleãããããããããšãã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã
ãã®ãã¿ãŒã³ã¯ãæ§é äœãããŒã¿ãææããã®ã§ã¯ãªãåç
§ããå Žåã«äžå¯æ¬ ã§ããæææš©ãæã€Stringãã£ãŒã«ãã䜿çšããæ¹ãåçŽã§ãããããã©ãŒãã³ã¹ãéèŠãªå Žé¢ã§ã¯åç
§ãä¿æããæ§é äœãæå¹ãªéžæè¢ãšãªããŸãã
Dangling reference questions appear frequently in Rust interviews. The answer is always: Rust prevents them at compile time through lifetime analysis. No runtime checks, no null pointers.
å®åã§äœ¿ãããæææš©ãã¿ãŒã³
æ¬çªç°å¢ã®Rustã³ãŒãã§ã¯ãããã€ãã®å®çªãšãªãæææš©ãã¿ãŒã³ãç¹°ãè¿ã䜿çšãããŸãããããã®ãã¿ãŒã³ãèªèã§ããããšããéçºé床ãšé¢æ¥ã§ã®ããã©ãŒãã³ã¹ã®äž¡æ¹ãåäžãããŸãã
fn process_and_return(mut input: String) -> String {
input.push_str(" -- processed");
input
}
fn contains_keyword(text: &str, keyword: &str) -> bool {
text.to_lowercase().contains(&keyword.to_lowercase())
}
fn sanitize(input: &mut String) {
*input = input.trim().to_string();
}
fn main() {
let raw = String::from("user input");
let processed = process_and_return(raw);
let found = contains_keyword(&processed, "input");
println!("Contains 'input': {}", found);
let mut padded = String::from(" spaces everywhere ");
sanitize(&mut padded);
println!("Sanitized: '{}'", padded);
}ãããã®ãã¿ãŒã³ã®äœ¿ãåãã«ã¯ãã·ã³ãã«ãªãã¥ãŒãªã¹ãã£ãã¯ããããŸããããã©ã«ãã§ã¯äžå€åç §ã§åçšãã倿Žãå¿ èŠãªå Žåã¯å¯å€åç §ã§åçšããåŒã³åºãå ããã®å€ãå¿ èŠãšããªããªã£ãå Žåã«ã®ã¿æææš©ãç§»åããŸãããã®ã¢ãããŒãã¯Ruståºç€ã¬ã€ãã§è©³ãã解説ãããŠããŸãã
process_and_returnã¯æææš©ãåãåã£ãŠè¿ããã¿ãŒã³ãcontains_keywordã¯äžå€åçšã®ã¿ã§èªã¿åããã¿ãŒã³ãsanitizeã¯å¯å€åçšã§å€æŽãããã¿ãŒã³ã§ããå®åã§ã¯ããã®3ã€ã®ãã¿ãŒã³ãé©åã«çµã¿åãããããšãæ±ããããŸãã
ãããŒãã§ãã«ãŒã®ãšã©ãŒãšå¯ŸåŠæ³
ãããŒãã§ãã«ãŒã¯ç¹å®ã®ãšã©ãŒã³ãŒããåºåããŸããããçºçãããšã©ãŒãçè§£ããããšã§ãã€ã©ã€ã©ããã³ã³ãã€ã«ãšã©ãŒãçŽ çŽãªä¿®æ£ã«å€ããããšãã§ããŸãã
fn main() {
let mut scores = vec![90, 85, 78];
let first = scores[0];
scores.push(95);
println!("First: {}, All: {:?}", first, scores);
let name = String::from("Alice");
let greeting = format!("Hello, {}", name);
println!("{} says {}", name, greeting);
let outer;
{
let inner = String::from("temporary");
outer = inner;
}
println!("{}", outer);
}ãã¹ãŠã®ä¿®æ£ã¯åãååã«åŸããŸããåçšãšæææš©ãRustã®ã«ãŒã«ã«æ²¿ãããã«ã³ãŒããåæ§æããããšã§ãããããŒãã§ãã«ãŒãšæŠãããšã¯ãéåžžãä»ã®èšèªã§ã¯ãã°ã®åå ãšãªãèšèšäžã®åé¡ãããããšã瀺ããŠããŸãã䞊è¡åŠçãšåçšã«é¢ããããé«åºŠãªãã¿ãŒã³ã§ã¯ãArcãMutexã®ãããªå
±ææææš©åãäžå¯æ¬ ã«ãªããŸãã
ãšã©ãŒã¡ãã»ãŒãžãæ³šææ·±ãèªãããšãéèŠã§ããRustã³ã³ãã€ã©ã®ãšã©ãŒã¡ãã»ãŒãžã¯éåžžã«è©³çްã§ãå€ãã®å Žåãä¿®æ£æ¹æ³ã®ææ¡ãå«ãŸããŠããŸãããšã©ãŒã³ãŒãïŒäŸïŒE0382ãE0502ïŒãããã¥ã¡ã³ãã§èª¿ã¹ãããšã§ãåé¡ã®æ¬è³ªãæ·±ãçè§£ã§ããŸãã
ä»ããç·Žç¿ãå§ããŸãããïŒ
颿¥ã·ãã¥ã¬ãŒã¿ãŒãšæè¡ãã¹ãã§ç¥èããã¹ãããŸãããã
ãŸãšã
- Rustã®ãã¹ãŠã®å€ã«ã¯1ã€ã®ææè
ãããã代å
¥æã«æææš©ãç§»åïŒã ãŒãïŒããŸãããã ãã
Copyãã¬ã€ããå®è£ ããåã¯äŸå€ã§ã - äžå€åç
§ïŒ
&TïŒã¯å ±æèªã¿åãã¢ã¯ã»ã¹ãèš±å¯ããå¯å€åç §ïŒ&mut TïŒã¯æä»çæžã蟌ã¿ã¢ã¯ã»ã¹ã匷å¶ããŸã - ãããŒãã§ãã«ãŒã¯ãããŒã¿ç«¶åãšãã³ã°ãªã³ã°åç §ãã³ã³ãã€ã«æã«é²æ¢ããã©ã³ã¿ã€ã ã³ã¹ãã¯ãŒãã§ã
- ã©ã€ãã¿ã€ã ã¯åç §ã®é¢ä¿æ§ã泚éãããã®ã§ãããæ°ããå¶çŽãäœæããã®ã§ã¯ãªããæ¢åã®å¶çŽãèšè¿°ããŸã
- ãããŒãã§ãã«ãŒãã³ãŒããæåŠããå Žåã¯ã
unsafeã«é Œãã®ã§ã¯ãªããæææš©ã®æµããåæ§æããã®ãæ£ããã¢ãããŒãã§ã - Rust颿¥åé¡éã§ãããã®ãã¿ãŒã³ãç·Žç¿ããæè¡é¢æ¥ã«åããçè§£ãæ·±ããããšããå§ãããŸã
Rust ã®ãã°ãèŠã€ããããŸãã
å®éã®ã³ãŒããé ãããã°ã1æ¥1åãã¢ã«ãŠã³ããªãã§è©ŠããŸãã

å·ç
Anthony Fillion-MailletSharpSkill 嵿¥è
10 幎以äžãã«ã¹ã¿ãã¯éçºã«æºãã£ãŠããŸããSharpSkill ãéå¶ããããã§å ¬éãããå 容ã«è²¬ä»»ãè² ã£ãŠããŸãã
2026幎3æ31æ¥ æŽæ°
ã¿ã°
å ±æ
é¢é£èšäº

Rustã®æææš©ãšåçšïŒå®å šã¬ã€ã
Rustã®æææš©ãšåçšã·ã¹ãã ããã¹ã¿ãŒããŸããæææš©ã«ãŒã«ãåç §ãã©ã€ãã¿ã€ã ãé«åºŠãªã¡ã¢ãªç®¡çãã¿ãŒã³ã解説ããŸãã

Rustã®ã¹ããŒããã€ã³ã¿åŸ¹åºè§£èª¬: BoxãRcãArcãRefCell(2026幎ç)
Rustã®ã¹ããŒããã€ã³ã¿BoxãRcãArcãRefCellãã2026幎ã®ã³ã³ãã€ã«å¯èœãªäŸãå€æè¡šãé »åºã®é¢æ¥è³ªåãšãšãã«è§£èª¬ããŸãã

Rust颿¥è³ªåïŒ2026幎çå®å šã¬ã€ã
Rustã®æè¡é¢æ¥ã§é »åºã®25åãå®å šç¶²çŸ ãæææš©ãåçšãã©ã€ãã¿ã€ã ããã¬ã€ããasync/awaitã䞊è¡åŠçã«ã€ããŠè©³çްãªåçãšã³ãŒãäŸä»ãã§è§£èª¬ããŸãã