やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのジェネリクス

 特定の型ではなく全ての型を示す方法。

成果物

コード

構造体(struct)

1つ

struct Point<T> {
    x: T,
    y: T,
}
fn main() {
    let integer = Point { x: 5, y: 10 }; // i32型
    let float = Point { x: 1.0, y: 4.0 }; // f64型
}

複数

struct Point<T,U> {
    x: T,
    y: U,
}
fn main() {
    let integer = Point { x: 5, y: 10 }; // i32型
    let float = Point { x: 1.0, y: 4.0 }; // f64型
    let int_f = Point { x: 5, y: 4.0 }; // i32,f64型
}

列挙体(enum)

enum Option<T> {
    Some(T),
    None,
}
enum Result<T, E> {
    Ok(T),
    Err(E),
}

メソッド

struct Point<T> {
    x: T,
    y: T,
}
impl<T> Point<T> {
    fn x(&self) -> &T { &self.x }
}
fn main() {
    let p = Point { x: 5, y: 10 };
    println!("p.x = {}", p.x());
}

 特定の型にのみ実装することもできる。

impl Point<f32> {
    fn distance_from_origin(&self) -> f32 {
        (self.x.powi(2) + self.y.powi(2)).sqrt()
    }
}

 複数の型で。

#[derive(Debug)]
struct Point<T, U> {
    x: T,
    y: U,
}
impl<T, U> Point<T, U> {
    fn mixup<V, W>(self, other: Point<V, W>) -> Point<T, W> {
        Point { x: self.x, y: other.y }
    }
}
fn main() {
    let p1 = Point { x: 5, y: 10.4 };
    let p2 = Point { x: "Hello", y: 'c'};
    let p3 = p1.mixup(p2);
    println!("{:?}", p3); // { x: 5, y: 'c' }
}

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで