我们如何在Rust中初始化BigDecimal数组?

5
我想要一个BigDecimal值的数组,因为我知道它的大小是固定的且提前已知。
然而,我无法弄清楚如何在Rust中初始化它。这个方法:
#[derive(Debug)]
struct BigArray { values: [BigDecimal; 52] }
fn main() {
    let mut v = BigArray { values: [BigDecimal::from_str("0"); 52] };
    println!("{:?}", v);
}

产生以下错误:

未为BigDecimal实现Copy特性

注意:重复元素需要复制,因此需要Copy特性

我希望默认的BigDecimal值可以在数组中克隆。这是否不可能?Vec是唯一的选择吗?
我可以将其转换为借用值,但那样它就不再是BigDecimal数组了,生命周期管理和悬空指针变得非常棘手。 这里可以将其转化为借用值。这里是Rust playground代码片段。

如何实现包含字符串或任何类型的类型的复制和克隆? - Nathaniel Johnson
1个回答

3

您可以动态创建一个向量(vec),然后将其转换为数组:

// --- Fake BigDecimal library for testing purposes.
#[derive(Clone, Debug)]
struct BigDecimal {
    str: String,
}
impl BigDecimal {
    fn from_str(str: &str) -> BigDecimal {
        BigDecimal {
            str: String::from(str),
        }
    }
}

// --- Code that is actually under test.
#[derive(Debug)]
struct BigArray {
    values: [BigDecimal; 10],
}
fn main() {
    let mut v = BigArray {
        values: (0..10)
            .map(|_| BigDecimal::from_str("0"))
            .collect::<Vec<_>>()
            .try_into()
            .unwrap(),
    };
    println!("{:?}", v);
}

游乐场

或者使用map

fn main() {
    let mut v = BigArray {
        values: [(); 10].map(|_| BigDecimal::from_str("0"))
    };
    println!("{:?}", v);
}

游乐场


非常感谢!这个工作得非常出色。第二个解决方案也很优雅! - Thaddee Tyl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接