gpt4 book ai didi

rust - 在编译时没有已知的大小

转载 作者:行者123 更新时间:2023-12-03 11:41:07 25 4
gpt4 key购买 nike

use std::fmt::Debug;

#[derive(Debug)]
struct Node<K: Debug, V: Debug> {
key: K,
value: V,
}

fn myprint<K: Debug + ?Sized, V: Debug + ?Sized>(node: &Node<K,V>) -> String {
return format!("{:?}: {:?}", node.key, node.value);
}

fn main() {
let node = Node{key: "xxx", value: "yyy"};
myprint(&node);
}
编译错误:
error[E0277]: the size for values of type `K` cannot be known at compilation time
--> src/main.rs:22:50
|
17 | struct Node<K: Debug,V: Debug> {
| - required by this bound in `Node`
...
22 | fn myprint<K:Debug+?Sized, V:Debug+?Sized>(node: &Node<K,V>) -> String {
| - ^^^^^^^^^^ doesn't have a size known at compile-time
| |
| this type parameter needs to be `std::marker::Sized`
但以下代码有效:
use std::fmt::Debug;

fn debug<T: Debug + ?Sized>(t: &T) { // T: Debug + ?Sized
println!("{:?}", t);
}

fn main() {
debug("my str"); // T = str, str: Debug + ?Sized ✔️
}

最佳答案

所有类型参数都是隐式 Sized .
这意味着 struct Node<K: Debug, V: Debug> {...}struct Node<K: Debug + Sized, V: Debug + Sized> {...} 相同.
为了让Sized必将被移除,特殊语法 ?Sized加入。这意味着类型参数可选地不是 Sized .
在函数中 myprint<K:Debug + ?Sized, V:Debug + ?Sized> ,您允许 K 为 不是 Sized .同时,KNode<K,V>必须是 Sized .这意味着存在类型参数 myprint允许但不能编译。
完全相同的问题也适用于 V .

how to resolve this problem


嗯,第一个问题是你需要支持 ?Sized作为 KVNode ?如果没有,您的函数也不需要支持它。
fn myprint<K: Debug, V: Debug>(node: &Node<K,V>) {...}
另一方面,如果您打算支持 ?Sized K/ V ,您需要正确定义您的结构:
struct Node<K: Debug + ?Sized, V: Debug + ?Sized> {...}

but fn debug<T: Debug+?Sized>(t: &T) can works!


是的。这是一个有效的签名。它在另一个函数中不起作用的原因是另一个函数说 K , 定义为 Debug + ?Sized 的类型需要在 Node<K, V>中使用这是一个 Debug + Sized (无问号)上下文。

关于rust - 在编译时没有已知的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63760418/

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