使用特征重载方法[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我正在努力使用Rust中的特征来模拟方法重载,其中涉及多种类型。

在C ++中我会写

struct PdlDict {
     void update(const string&,const string&, double x) {...}
     void update(const string&,const string&, const string x) {...}
};

并称之为

 PdlDict d;
 d.update(123.0);
 d.update("foo");

在Rust中这个PdlDict结构

pub struct PdlDict {
    pub pdl_items: Vec<PdlItem>,
}
impl PdlDict {
    fn new() -> PdlDict {
        PdlDict {
            pdl_items: Vec::new(),
        }
    }
}

我实现了这个有效的特性

trait UpdatePdl {
    fn update(&self, item: &PdlDict, object_name: &str, name: &str);
}
impl<'a> UpdatePdl for &'a str {
    fn update(&self, item: &PdlDict, object_name: &str, name: &str) {}
}
impl<'a> UpdatePdl for f32 {
    fn update(&self, item: &PdlDict, object_name: &str, name: &str) {}
}

调用不符合人体工程学,因为我必须将想要更新的对象作为第一个参数传递:

"bar".update(&pdl, "r", "result");
64.0.update(&pdl, "r", "result");

以惯用Rust方式实现相同语义的更合适的方法是什么?

我怀疑它是特征和模板的组合,但我想不出如何处理这个问题。

编辑注意这个问题不是询问如何使用traits实现继承。我已经在这个例子中完成了这个,它工作正常。它要求一种以上面给出的样式表达继承的方法

rust traits
1个回答
1
投票

IMO,惯用的方式是写一些像你做的那样,然后添加人机工程学:

impl PdlDict {
    fn update<T: UpdatePdl>(&self, object_name: &str, name: &str, t: T) {
        t.update(&self, object_name, name)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.