例えば、こんな一文があります。
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
東京-山形
東京-青森