例えば、こんな一文があります。
type BoxedHandler = dyn Fn(Request<Body>) -> Box<dyn futures::Future<Output = Response<Body>> + Send> + Send + Sync;
typeがエイリアスなのはわかりますが、dynって一体なんでしょうか?
=>
dyn はRustにおける動的ディスパッチ(dynamic dispatch)を表すキーワードで、トレイトオブジェクトを使うときに必要
L どの型が来るかは実行時に決まる
L 複数の異なる型を一つのコレクションで扱いたい
trait Animal { fn speak(&self); } struct Dog; struct Cat; impl Animal for Dog { fn speak(&self) { println!("Woof!"); } } impl Animal for Cat { fn speak(&self) { println!("Meow!"); } } fn make_animal_noise(animal: &dyn Animal) { animal.speak(); } fn main() { let dog = Dog; let cat = Cat; make_animal_noise(&dog); make_animal_noise(&cat); }
うーん、わかったようなわかってないような…
別の例に置き換える
trait BulletTrain { fn run(&self); } struct TohokuShinkansen; struct YamagataShinkansen; impl BulletTrain for TohokuShinkansen { fn run(&self) { println!("東京-山形"); } } impl BulletTrain for YamagataShinkansen { fn run(&self) { println!("東京-青森"); } } fn travel_to_tohoku(bullettrain: &dyn BulletTrain) { bullettrain.run(); } fn main() { let hayabusa1 = TohokuShinkansen; let tsubasa1 = YamagataShinkansen; travel_to_tohoku(&hayabusa1); travel_to_tohoku(&tsubasa1); }
$ ./playground
東京-山形
東京-青森