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
.同时,K
在 Node<K,V>
必须是 Sized
.这意味着存在类型参数 myprint
允许但不能编译。
完全相同的问题也适用于 V
.
how to resolve this problem
嗯,第一个问题是你需要支持
?Sized
作为 K
或 V
在 Node
?如果没有,您的函数也不需要支持它。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/