【问题标题】:Why can't I write a function with the same type as Box::new?为什么我不能编写与 Box::new 相同类型的函数?
【发布时间】:2023-03-03 20:23:02
【问题描述】:

如果我编写一个函数,它接受一个 [f32] 类型的参数(而不是 &[f32]),我会收到一个错误:

the trait bound `[f32]: std::marker::Sized` is not satisfied

文档说这是因为[f32] 没有编译时已知的大小。合理的限制。很公平。

但是,标准库中至少有一个具有这种类型的函数。这是我的称呼:

let b: Box<[f32]> = Box::new([1.0, 2.0, 3.0]);

为什么这在标准库中是允许的,而不是在我的代码中?相关的区别是什么? (the source 没有明显的魔法)。

【问题讨论】:

    标签: rust dynamic-sizing


    【解决方案1】:

    [f32] 未调整大小。但是,[1.0, 2.0, 3.0] 的大小是……它的类型是 [f32; 3]

    这就是T 使用标准库代码编译时的结果,即[f32; 3] 大小的数组。

    要自己接受一个大小的数组,你可以这样做:

    fn my_func(array: [f32; 3]) {
        // Implementation here
    }
    
    my_func([1.0, 0.0, 0.0]);
    

    Click here to see a working sample 在操场上

    &amp;[f32] 切片的大小也是如此。这也是它被允许的原因。

    正如 Lukas 在 cmets 中指出的那样,切片是一个“胖指针”(You can read about Dynamically Sized Types in the Nomicon)。切片胖指针由一个指向一段数据的指针和一个表示该数据大小的值组成。

    【讨论】:

    • 我为b 提供了一个明确的类型。这是否不能确定 Box 实例化的类型?
    • @apt1002 该类型约束导致Box&lt;[f32; 3]&gt; 强制转换为Box&lt;[f32]&gt;。您可以通过尝试使用明显不正确的类型来证明这一点:let b: () = Box::new([1.0, 2.0, 3.0]); 将产生一个错误,告诉您右侧是Box&lt;[{float}; 3]&gt;(因为此时浮点文字不是任何特定的浮点类型)。
    • 它的大小是引用的大小 -> 不,它是一个胖指针,所以大小是指针大小的两倍。
    • @LukasKalbertodt 我确实是这个意思,但没有表达出来。现在我回家了。
    猜你喜欢
    • 2022-01-22
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2017-04-23
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多