Rust 2026幎ç ãã¬ã€ããšãžã§ããªã¯ã¹å®å šã¬ã€ãïŒã¢ãããã£ã¹ããAsyncFnã颿¥å¯Ÿç
Rust 2024 Editionã§è¿œå ããããã¬ã€ããªããžã§ã¯ãã®ã¢ãããã£ã¹ããAsyncFnãã¬ã€ããRPITITãªã©ã®æ°æ©èœããã³ã³ãã€ã«å¯èœãªã³ãŒãäŸãšå ±ã«è§£èª¬ãçŸå Žã§åãããé«åºŠãªé¢æ¥è³ªåã«ã察å¿ã

Rustã®ãã¬ã€ããšãžã§ããªã¯ã¹ã¯ãããããæ¬æ ŒçãªRustããã°ã©ã ã®åºç€ãæ§æããèŠçŽ ã§ããRust 2024 EditionïŒRust 1.85ã§å®å®åïŒããã³1.86以éã®ãªãªãŒã¹ã«ããããã¬ã€ãã·ã¹ãã ã¯å€§å¹
ã«åŒ·åãããŸããããã¬ã€ããªããžã§ã¯ãã®ã¢ãããã£ã¹ããAsyncFnãã¬ã€ãã«ããéåæã¯ããŒãžã£ãimpl Traitã®ã©ã€ãã¿ã€ã ãã£ããã£ã«ãŒã«ã®æ¹åãªã©ãå€ãã®æ°æ©èœãå°å
¥ãããŠããŸããæ¬ã¬ã€ãã§ã¯ãåæ©èœãã³ã³ãã€ã«å¯èœãªã³ãŒããšå
±ã«è§£èª¬ãã2026å¹Žã®æ¡çšé¢æ¥ã§å®éã«åãããé«åºŠãªè³ªåãåãäžããŸãã
Rust 1.85ïŒ2024 EditionïŒã§ã¯ãAsyncFnãAsyncFnMutãAsyncFnOnceããã¬ãªã¥ãŒãã«è¿œå ãããuse<..>ããŠã³ãã«ããRPITã®ã©ã€ãã¿ã€ã ãã£ããã£ãæ¹åãããgenãããŒã¯ãŒããšããŠäºçŽãããŸãããRust 1.86ã§ã¯ãã¬ã€ããªããžã§ã¯ãã®ã¢ãããã£ã¹ããå®å®åãã&dyn Subtraitãã&dyn Supertraitãžã®å€æããã€ã©ãŒãã¬ãŒããªãã§å¯èœã«ãªããŸããã
çµéšè±å¯ãªéçºè ã§ãã€ãŸãããã¬ã€ãã®åºç€
ãã¬ã€ãã¯å ±éã®æ¯ãèããå®çŸ©ãããžã§ããªã¯ã¹ã¯é¢æ°ãåãå€ãã®å ·äœåã«å¯ŸããŠåäœããããšãå¯èœã«ããŸãããã®2ã€ãçµã¿åãããããšã§ãç¶æ¿ããŒã¹ã®ããªã¢ãŒãã£ãºã ãã³ã³ããžã·ã§ã³ã§çœ®ãæããããšãã§ããŸããã³ã³ãã€ã©ã¯ãžã§ããªãã¯ã³ãŒããã³ã³ãã€ã«æã«åçžåïŒmonomorphizeïŒããã©ã³ã¿ã€ã ãªãŒããŒãããã®ãªããŒãã³ã¹ãæœè±¡åãå®çŸããŸãã
颿¥ã§ããã€ãŸãããã€ã³ãã¯ãéçãã£ã¹ãããïŒimpl Traitããžã§ããªã¯ã¹ïŒãšåçãã£ã¹ãããïŒdyn TraitïŒã®éãã§ããéçãã£ã¹ãããã¯å
·äœçãªå®è£
ãã€ã³ã©ã€ã³åããŸããåçãã£ã¹ãããã¯vtableãçµç±ããåŒã³åºãããšã«1åã®ãã€ã³ã¿éæ¥åç
§ã远å ãããŸãã
// Static dispatch: monomorphized at compile time
fn print_static(item: &impl std::fmt::Display) {
println!("{item}");
}
// Dynamic dispatch: vtable lookup at runtime
fn print_dynamic(item: &dyn std::fmt::Display) {
println!("{item}");
}éçãã£ã¹ãããã¯ãã³ã³ãã€ã©ãååçžåã³ããŒãã€ã³ã©ã€ã³åã»æé©åã§ãããããããé«éãªã³ãŒããçæããŸããäžæ¹ãåçãã£ã¹ãããã¯ã³ã³ãã€ã«æã«å ·äœåãäžæãªå ŽåãäŸãã°ãã©ã°ã€ã³ã·ã¹ãã ãç°çš®ã³ã¬ã¯ã·ã§ã³ãªã©ã§åšåãçºæ®ããŸãã
Rust 1.86以éã®ãã¬ã€ããªããžã§ã¯ãã¢ãããã£ã¹ã
Rust 1.86以åã¯ã&dyn Childã&dyn Parentã«å€æããã«ã¯ããã¬ã€ãã«æåã§as_parent()ã¡ãœãããå®çŸ©ããå¿
èŠããããŸããããã¬ã€ãã¢ãããã£ã¹ãã«ããããã®ãã€ã©ãŒãã¬ãŒããå®å
šã«äžèŠã«ãªããŸãããã³ã³ãã€ã©ã&ã&mutãBoxãRcãArcã«å¯ŸããŠvtableã®åãæ¿ããééçã«åŠçããŸãã
use std::any::Any;
use std::fmt::Debug;
trait Describable: Debug + Any {
fn describe(&self) -> String;
}
#[derive(Debug)]
struct Sensor {
name: String,
value: f64,
}
impl Describable for Sensor {
fn describe(&self) -> String {
format!("{}: {:.2}", self.name, self.value)
}
}
fn downcast_example(item: &dyn Describable) {
// Upcast to &dyn Any â works since Rust 1.86
let any_ref: &dyn Any = item;
if let Some(sensor) = any_ref.downcast_ref::<Sensor>() {
println!("Sensor detected: {}", sensor.name);
}
}Describableãã¬ã€ãã¯Anyãã¹ãŒããŒãã¬ã€ããšããŠæã£ãŠããŸãã1.86以åã¯ã&dyn Describableã«å¯ŸããŠdowncast_refãåŒã¶ã«ã¯æç€ºçãªãã£ã¹ãã¡ãœãããå¿
èŠã§ãããçŸåšã¯&dyn Describableãã&dyn Anyãžã®å倿ãæé»çã«è¡ãããŸãããã®ãã¿ãŒã³ã¯ãã€ãã³ãã·ã¹ãã ãã©ã³ã¿ã€ã ã§ã®åæ€æ»ãå¿
èŠãªã³ã³ããŒãã³ãããŒã¹ã¢ãŒããã¯ãã£ã§ç¹ã«æçšã§ãã
AsyncFnãã¬ã€ãïŒãã¡ãŒã¹ãã¯ã©ã¹ã®éåæã¯ããŒãžã£
Rust 1.85ã§ã¯ãéåæã¯ããŒãžã£ïŒasync || {}ïŒãš3ã€ã®æ°ãããã¬ã€ãAsyncFnãAsyncFnMutãAsyncFnOnceãå®å®åãããŸãããããã«ãããåŸæ¥ã®2ã€ã®ãžã§ããªãã¯ãã©ã¡ãŒã¿ã«ããåé¿çF: Fn() -> Fut, Fut: Future<Output = T>ããåäžã®ãšã«ãŽãããã¯ãªããŠã³ãã§çœ®ãæããããŸãã
use std::time::Duration;
use tokio::time::sleep;
// Before Rust 1.85: two generic params needed
async fn retry_old<F, Fut>(max: usize, f: F) -> Result<String, String>
where
F: Fn() -> Fut,
Fut: std::future::Future<Output = Result<String, String>>,
{
for _ in 0..max {
if let Ok(val) = f().await {
return Ok(val);
}
}
Err("max retries reached".into())
}
// After Rust 1.85: single AsyncFn bound
async fn retry<F>(max: usize, f: F) -> Result<String, String>
where
F: AsyncFn() -> Result<String, String>,
{
for _ in 0..max {
if let Ok(val) = f().await {
return Ok(val);
}
}
Err("max retries reached".into())
}AsyncFnããŠã³ãã¯å¯èªæ§ãé«ããã©ã€ãã¿ã€ã ãã£ããã£ãæ£ããåŠçããŸãããã¬ã€ãéå±€ã¯åæçãšåãæ§é ãæã¡ãŸããAsyncFnïŒäžå€åçšïŒã¯AsyncFnMutïŒå¯å€åçšïŒã®ãµããã¬ã€ãã§ãããAsyncFnMutã¯AsyncFnOnceïŒãã£ããã£ãæ¶è²»ïŒã®ãµããã¬ã€ãã§ããå¿
èŠæå°éã®ããŠã³ããéžã¶ããšã§ãåŒã³åºãåŽã«æå€§éã®æè»æ§ãæäŸã§ããŸãã
AsyncFnMutã¯ãã£ããã£ããç¶æ
ãåŒã³åºãéã§å€æŽã§ããŸãããåæå®è¡ã¯é²æ¢ããŸããAsyncFnã¯äžå€åçšã®ã¿ã®ãããåæåŒã³åºããå¯èœã§ãããªãã©ã€ããžãã¯ãã¬ãŒããªããã¿ã詊è¡åæ°ã远跡ããã«ãŠã³ã¿ãªã©ãç¶æ
ã®å€æŽãå¿
èŠãªå Žåã¯AsyncFnMutãé©åãªéžæã§ãã
ãã¬ã€ãã«ãããReturn-Position impl TraitïŒRPITITïŒ
Rust 1.75以éããã¬ã€ãã¡ãœããã¯ãã¯ã·ã³ã°ãªãã§-> impl Traitãè¿ãããšãã§ããŸããã³ã³ãã€ã©ã¯ãããå¿åã®é¢é£åã«ãã·ã¥ã¬ãŒããåŒã³åºãåŽããå
·äœçãªæ»ãåãé èœãã€ã€ãããŒãã¢ãã±ãŒã·ã§ã³ãåé¿ããŸãã
trait EventStream {
// Each implementor returns its own iterator type â no Box needed
fn events(&self) -> impl Iterator<Item = &str>;
}
struct FileLog {
entries: Vec<String>,
}
impl EventStream for FileLog {
fn events(&self) -> impl Iterator<Item = &str> {
self.entries.iter().map(|s| s.as_str())
}
}
struct MemoryLog {
buffer: Vec<String>,
}
impl EventStream for MemoryLog {
fn events(&self) -> impl Iterator<Item = &str> {
self.buffer.iter().map(|s| s.as_str())
}
}åå®è£
è
ã¯ç°ãªãå
·äœçãªã€ãã¬ãŒã¿åãæäŸããŸããããã¬ã€ããimpl Iteratorã®èåŸã«ãã®è©³çްãé èœããŸãããã ãå¶éããããRPITITã®æ»ãåã¯dynäºæã§ã¯ãªããããimpl Traitãè¿ãã¡ãœãããæã€ãã¬ã€ãã§ã¯&dyn EventStreamã䜿çšã§ããŸãããåçãã£ã¹ããããå¿
èŠãªå Žåã¯ãåŒãç¶ãBox<dyn Iterator>ã䜿çšããå¿
èŠããããŸãã
Rustã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
é«åºŠãªãžã§ããªã¯ã¹ãã¿ãŒã³ïŒãã¬ã€ãããŠã³ããšWhereå¥
è€éãªãžã§ããªãã¯å¶çŽã¯ãRust颿¥ã®å®çªããŒãã§ãã以äžã®ãã¿ãŒã³ã§ã¯ãé¢é£åããã¬ã€ãããŠã³ããWhereå¥ãçµã¿åãããŠãåå®å šãªãã€ãã©ã€ã³ãæ§ç¯ããŸãã
use std::fmt::Display;
trait Transform {
type Input;
type Output: Display; // Output must be displayable
fn apply(&self, input: Self::Input) -> Self::Output;
}
struct Uppercase;
impl Transform for Uppercase {
type Input = String;
type Output = String;
fn apply(&self, input: String) -> String {
input.to_uppercase()
}
}
// Chain two transforms with compatible types
fn chain<A, B>(a: &A, b: &B, input: A::Input) -> B::Output
where
A: Transform,
B: Transform<Input = A::Output>,
{
let mid = a.apply(input);
b.apply(mid)
}where B: Transform<Input = A::Output>ãšããå¶çŽã«ããã倿Aã®åºåã倿Bã®å
¥åãšäžèŽããããšãã³ã³ãã€ã«æã«ä¿èšŒãããŸããã©ã³ã¿ã€ã ãã§ãã¯ãã¢ã³ã©ããã³ã°ãäžèŠã§ãåã·ã¹ãã ãæ£ãããä¿èšŒããŸãã
ã©ã€ãã¿ã€ã ãã£ããã£ã«ãŒã«ãšuse<..>ããŠã³ã
2024 Editionã§ã¯ã-> impl Traitãã©ã€ãã¿ã€ã ããã£ããã£ããæ¹æ³ã倿ŽãããŸããã以åã¯ãèªç±é¢æ°ã«ãããRPITã¯åãã©ã¡ãŒã¿ãšconstãã©ã¡ãŒã¿ã®ã¿ããã£ããã£ããŠããŸãããçŸåšã¯ãã©ã€ãã¿ã€ã ãå«ãã¹ã³ãŒãå
ã®å
šãŠã®ãžã§ããªãã¯ãã©ã¡ãŒã¿ãããã©ã«ãã§ãã£ããã£ãããŸããuse<..>æ§æã䜿ãããšã§ãããçããã£ããã£ãå¿
èŠãªå Žåã«æç€ºçãªå¶åŸ¡ãå¯èœã§ãã
// Captures both 'a and T by default in 2024 Edition
fn filtered_items<'a, T: 'a>(
items: &'a [T],
predicate: fn(&T) -> bool,
) -> impl Iterator<Item = &'a T> {
items.iter().filter(move |item| predicate(item))
}
// Explicit capture: only capture 'a and T, not other lifetimes
fn explicit_capture<'a, 'b, T: 'a>(
items: &'a [T],
_label: &'b str,
) -> impl Iterator<Item = &'a T> + use<'a, T> {
items.iter()
}use<'a, T>ããŠã³ãã¯ãè¿ããããªããŒã¯åã'aãšTã«ã®ã¿äŸåãã'bã«ã¯äŸåããªãããšãã³ã³ãã€ã©ã«äŒããŸããããã«ãããåŒã³åºãåŽãã€ãã¬ãŒã¿ãæ¶è²»ããåã«_labelãããããããããšã劚ããäžèŠãªã©ã€ãã¿ã€ã å¶çŽãåé¿ã§ããŸãã
颿¥å¯ŸçïŒãã¬ã€ããšãžã§ããªã¯ã¹ã®æ·±æã質å
以äžã®è³ªåã¯ãRustãæ¬çªç°å¢ã§äœ¿çšããŠããäŒæ¥ã®é¢æ¥ã§é »ç¹ã«åºé¡ãããŸããå質åã¯ãããã¥ã¡ã³ããèªãã ã ãã®åè£è ãšå®éã«ã·ã¹ãã ãæ§ç¯ããåè£è ãåºå¥ããããã®ãç¹å®ã®æŠå¿µã察象ãšããŠããŸãã
Q1: 颿°ã®æ»ãåãšããŠã®impl Traitãšdyn Traitã®éãã¯äœã§ããïŒ
impl Traitã¯ã颿°æ¬äœãéžæããåäžã®å
·äœåãè¿ããŸããã³ã³ãã€ã©ã¯ååŒã³åºããµã€ããåçžåããŸããdyn Traitã¯vtableããŒã¹ã®åçãã£ã¹ããããæã€ãã¬ã€ããªããžã§ã¯ããè¿ããç°ãªãã³ãŒããã¹ããç°ãªãå
·äœåãè¿ãããšãå¯èœã§ããimpl Traitã¯ãŒãã³ã¹ãã§ããã颿°ãæ£ç¢ºã«1ã€ã®åã®ã¿ãè¿ãããšã«å¶éãããŸããdyn Traitã¯Boxã«ããããŒãã¢ãã±ãŒã·ã§ã³ãšåŒã³åºãããšã®ãã€ã³ã¿éæ¥åç
§ã远å ãããŸãã
Q2: impl Traitãè¿ããã¬ã€ãã¡ãœããã¯åçãã£ã¹ããããšå
±ã«äœ¿çšã§ããŸããïŒ
ã§ããŸããã-> impl Traitãè¿ãã¡ãœããã¯ããã®ãã¬ã€ããédynäºæïŒæ§ç§°ãéãªããžã§ã¯ãã»ãŒããïŒã«ããŸããã³ã³ãã€ã©ã¯vtableã®èåŸã«ããå
·äœçãªæ»ãåãæ±ºå®ã§ããŸãããåé¿çã¯ã代ããã«Box<dyn Trait>ãè¿ããããã¬ã€ããdynäºæã®åºåºãã¬ã€ããšãžã§ããªã¯ã¹ãçšããæ¡åŒµãã¬ã€ãã«åå²ããããšã§ãã
Q3: ãã¬ã€ãã®äžè²«æ§ïŒcoherenceïŒãšãªãŒãã¡ã³ã«ãŒã«ã«ã€ããŠèª¬æããŠãã ããã
Rustã¯ãäžããããåã«å¯ŸããŠäžãããããã¬ã€ãã®å®è£
ãæå€§1ã€ã§ããããšã匷å¶ããŸãããªãŒãã¡ã³ã«ãŒã«ã¯ããã¬ã€ããŸãã¯åã®ãããããå®çŸ©ããŠããã¯ã¬ãŒãã«ã®ã¿ãã¬ã€ãå®è£
ãå¶éããŸããããã«ãããäŸåé¢ä¿éã§ã®å®è£
ã®è¡çªã鲿¢ãããŸããå€éšåã«å¯Ÿããå€éšãã¬ã€ãã®å®è£
ãå¿
èŠãªå Žåã¯ããã¥ãŒã¿ã€ããã¿ãŒã³ïŒstruct Wrapper(Inner)ïŒãæšæºçãªåé¿çã§ãã
ãã¬ã€ããªããžã§ã¯ãã»ãŒããã£ãšãã¬ã€ãããŠã³ããæ··åããåè£è
ãå€ãèŠåããããŸãããã¬ã€ãã¯ãžã§ããªãã¯ã¡ãœãããæã€ããšãã§ãïŒããã¯dynäºææ§ã劚ããŸãïŒãããã§ããžã§ããªãã¯ããŠã³ãã§ã¯äœ¿çšå¯èœã§ããwhere Self: Sizedãšã¹ã±ãŒããããã䜿ãããšã§ããã¬ã€ãå
šäœãédynäºæã«ããããšãªããç¹å®ã®ã¡ãœãããåçãã£ã¹ãããããé€å€ã§ããŸãã
Q4: ãã¬ã€ãã¢ãããã£ã¹ãã¯ãšã©ãŒãã³ããªã³ã°ãã¿ãŒã³ãã©ã®ããã«å€ããŸãããïŒ
ãã¬ã€ãã¢ãããã£ã¹ãïŒRust 1.86以éïŒã«ããããã¡ã€ã³åºæã®ãšã©ãŒãã¬ã€ããšstd::error::ErrorïŒDebug + Displayãã¹ãŒããŒãã¬ã€ããšããŠæã€ïŒã®äž¡æ¹ãå®è£
ããã«ã¹ã¿ã ãšã©ãŒåããèªåçã«&dyn Errorã«ã¢ãããã£ã¹ãã§ããããã«ãªããŸããã1.86以åã¯ãBox<dyn CustomError>ãBox<dyn Error>ã«å€æããã«ã¯ãæåã§ã®Fromå®è£
ããã«ããŒã¡ãœãããå¿
èŠã§ãããã¢ãããã£ã¹ãã«ããããã®é
管ã³ãŒããäžèŠã«ãªããŸãã
Q5: AsyncFnãã¬ã€ãã¯Fn() -> impl Futureã§ã¯è§£æ±ºã§ããªãäœã®åé¡ã解決ããŸããïŒ
Fn() -> impl Future<Output = T>ããŠã³ãã¯ãè¿ãããFutureãã¯ããŒãžã£ã®ãã£ããã£ããç¶æ
ããåçšããããšãæ£ãã衚çŸã§ããŸãããããã«ãããFutureãã¯ããŒãžã£ãææããããŒã¿ãåç
§ããå¿
èŠãããå Žåã«ã©ã€ãã¿ã€ã ãšã©ãŒãçºçããŸããAsyncFnãã¬ã€ãã¯ãã³ã³ãã€ã©ãã¯ããŒãžã£ã®ãã£ããã£ãšFutureã®ã©ã€ãã¿ã€ã ã®é¢ä¿ãçè§£ããããããã®åé¡ãæ£ããåŠçããŸããRFC 3668ã«æ£ç¢ºãªã»ãã³ãã£ã¯ã¹ã詳述ãããŠããŸãã
Rustã®é¢æ¥å¯ŸçãšããŠãæææš©ãšåçšãTokioã䜿ã£ãasync/awaitã«é¢ããããå€ãã®è³ªåã¯ãRust颿¥æºåãã©ãã¯ã§ç¢ºèªã§ããŸãã
ä»ããç·Žç¿ãå§ããŸãããïŒ
颿¥ã·ãã¥ã¬ãŒã¿ãŒãšæè¡ãã¹ãã§ç¥èããã¹ãããŸãããã
ãŸãšã
- ãã¬ã€ãã¢ãããã£ã¹ãïŒRust 1.86ïŒã¯ãæåã®
as_supertrait()ãã€ã©ãŒãã¬ãŒããæé€ããŸããã©ã³ã¿ã€ã ã§ã®åæ€æ»ãå¿ èŠãªå Žåã¯ãAnyãã¹ãŒããŒãã¬ã€ããšãããã¬ã€ãéå±€ãèšèšããããšãæšå¥šãããŸãã AsyncFnãAsyncFnMutãAsyncFnOnceïŒRust 1.85ïŒã¯ãFn() -> Fut, Fut: Futureãã¿ãŒã³ã眮ãæããŸããåŒã³åºããµã€ãã®èŠä»¶ãæºããæã匱ãããŠã³ãã䜿çšããŠãã ããã- RPITITïŒRust 1.75以éïŒã«ããããã¬ã€ãã¡ãœããããã¯ã·ã³ã°ãªãã§
-> impl Traitãè¿ãããšãå¯èœã§ãããã ããdynäºææ§ã倱ãããããšã«æ³šæãå¿ èŠã§ãã - 2024 Editionã®
use<..>ããŠã³ãã«ãããimpl Traitã®æ»ãåããã£ããã£ããã©ã€ãã¿ã€ã ãæç€ºçã«å¶åŸ¡ã§ããŸãã - ãã¬ã€ãã«é¢ãã颿¥è³ªåã¯ãéçãã£ã¹ããããšåçãã£ã¹ãããã®ãã¬ãŒããªããäžè²«æ§ã«ãŒã«ãæ¡åŒµæ§ãç¶æãããã¬ã€ãéå±€ã®èšèšèœåã®3ç¹ããã¹ãããŸãã
- ããã§åãäžããå
šãŠã®æ©èœã«ã¢ã¯ã»ã¹ããã«ã¯ãRust 1.86以éã䜿çšããŠãã ããã
rustup update stableã§ææ°ã®ããŒã«ãã§ã€ã³ã確ä¿ã§ããŸãã
ã¿ã°
å ±æ
é¢é£èšäº

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

Rust Webãã¬ãŒã ã¯ãŒã¯æ¯èŒïŒActix Web vs Axum â 2026幎çã¬ã€ããšé¢æ¥å¯Ÿç
Actix Web 4.13ãšAxum 0.8ã®ã¢ãŒããã¯ãã£ãããã©ãŒãã³ã¹ãããã«ãŠã§ã¢èšèšãæ¯èŒã2026幎ã®Rustããã¯ãšã³ã颿¥ã§é »åºãã質åãšåçäŸã解説ããŸãã

Rustã®Async/Await培åºè§£èª¬ïŒTokioãFuturesãéåæäžŠè¡åŠçã®ä»çµã¿ãšå®è·µ
Rustã®Async/Awaitã®ä»çµã¿ãTokioã©ã³ã¿ã€ã ãFutureãã¬ã€ããã¿ã¹ã¯ã¹ããŒã³ãæ§é åããã䞊è¡åŠçãå®è·µçãªãã¿ãŒã³ãŸã§æ·±æã解説ããŸãã