使用特征重载方法
Overload a method using traits
我正在努力使用 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 和模板的结合,但我想不出如何解决这个问题。
编辑
注意这个问题不是问如何使用特征实现继承。我已经在这个例子中完成了这个并且工作正常。它要求一种以上面给出的样式表达继承的方法
IMO,惯用的方法是像你所做的那样写一些东西,然后添加人体工程学:
impl PdlDict {
fn update<T: UpdatePdl>(&self, object_name: &str, name: &str, t: T) {
t.update(&self, object_name, name)
}
}
我正在努力使用 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 和模板的结合,但我想不出如何解决这个问题。
编辑 注意这个问题不是问如何使用特征实现继承。我已经在这个例子中完成了这个并且工作正常。它要求一种以上面给出的样式表达继承的方法
IMO,惯用的方法是像你所做的那样写一些东西,然后添加人体工程学:
impl PdlDict {
fn update<T: UpdatePdl>(&self, object_name: &str, name: &str, t: T) {
t.update(&self, object_name, name)
}
}