gpt4 book ai didi

rust - 如何正确特征化与对象不安全类型一起使用的对象?

转载 作者:行者123 更新时间:2023-12-03 11:37:26 28 4
gpt4 key购买 nike

我想创建一个包含特征对象的向量,该特征对象具有返回可比较值的val方法:

trait Comparable {
fn val(&self) -> Box<dyn std::cmp::Ord>;
}

struct Int64Array {}

impl Comparable for Int64Array {
fn val(&self, i: usize) -> Box<dyn std::cmp::Ord> {
Box::new(i+1)
}
}

struct StringArray {}

impl Comparable for StringArray {
fn val(&self, i: usize) -> Box<dyn std::cmp::Ord> {
Box::new(format!("foo_{}", i))
}
}

fn main() {
// each row is guaranteed to have vector elements with the same type
let rows: Vec<Box<dyn Comparable>> = vec![
Box::new(Int64Array{}),
Box::new(StringArray{}),
];
println!("{}", rows[0].val(0).cmp(rows[0].val(1)));
println!("{}", rows[1].val(0).cmp(rows[1].val(1)));
}

但是,由于 std::cmp::Ord不是对象安全的特征,因此不会编译。解决此限制的推荐方法是什么?

最佳答案

感谢大家的快速答复。

结合@FrancisGagné和@loganfsmyth的建议,以下是一种避免直接使用Ord特性的解决方法:

trait Comparable {
fn compare(&self, i: usize, j: usize) -> std::cmp::Ordering;
}

struct Int64Array {}

impl Comparable for Int64Array {
fn compare(&self, _i: usize, _j: usize) -> std::cmp::Ordering {
std::cmp::Ordering::Equal
}
}

struct StringArray {}

impl Comparable for StringArray {
fn compare(&self, _i: usize, _j: usize) -> std::cmp::Ordering {
std::cmp::Ordering::Equal
}
}

fn main() {
// each row is guaranteed to have vector elements with the same type
let rows: Vec<Box<dyn Comparable>> = vec![
Box::new(Int64Array{}),
Box::new(StringArray{}),
];
println!("{:#?}", rows[0].compare(0, 1));
println!("{:#?}", rows[1].compare(0, 1));
}

我想知道是否还有其他方法可以实现此功能。

关于rust - 如何正确特征化与对象不安全类型一起使用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61981945/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com