Rust 实现默认值和函数重载

默认值实现

默认值只需要实现 Default trait 即可,如:

fn main() {
    let foo1 = Foo::new();

    // 默认值
    let foo2 = Foo::default();
}

struct Foo {
    bar: String,
    baz: i32,
    foo: bool,
}

impl Default for Foo {
    fn default() -> Self {
        Self {
            bar: Default::default(),
            baz: Default::default(),
            foo: Default::default(),
        }
    }
}

impl Foo {
    fn new() -> Self {
        Default::default()
    }
}

函数重载实现

Rust 本身不提供函数重载功能,但是可以通过 Trait 和泛型组合实现,如:

fn main() {
    // 函数重载调用
    let foo3 = Foo::call(1);
    let foo4 = Foo::call(String::from("Rustln"));
    let foo5 = Foo::call(true);
}

/// 定义可重载的 Traits
pub trait Overloaded<T> {
    fn call(value: T) -> Self;
}

struct Foo {
    bar: String,
    baz: i32,
    foo: bool,
}

impl Default for Foo {
    fn default() -> Self {
        Self {
            bar: Default::default(),
            baz: Default::default(),
            foo: Default::default(),
        }
    }
}

impl Foo {
    fn new() -> Self {
        Default::default()
    }
}

/// 为不同的类型参数实现重载,如 String
impl Overloaded<String> for Foo {
    fn call(value: String) -> Self {
        Foo {
            bar: value,
            ..Default::default()
        }
    }
}

/// 为不同的类型参数实现重载,如 i32
impl Overloaded<i32> for Foo {
    fn call(value: i32) -> Self {
        Foo {
            baz: value,
            ..Default::default()
        }
    }
}

/// 为不同的类型参数实现重载,如 bool
impl Overloaded<bool> for Foo {
    fn call(value: bool) -> Self {
        Foo {
            foo: value,
            ..Default::default()
        }
    }
}
posted @ 2022-04-25 11:33  Rustln  阅读(2878)  评论(0编辑  收藏  举报