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

标签 rust

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/

相关文章:

visual-studio-code - 通过命令行为 VS Code 完成 Rust 插件安装

rust - 匹配和解包之间的不同行为

rust - 什么时候需要使闭包变量可变?

types - 如何将元组解构为类型变量?

unit-testing - 如何在 Rust 中模拟特定方法而不是所有方法?

rust - Rust 生命周期会影响编译程序的语义吗?

rust - `use path::{self}` 是什么意思?

parsing - 无法为 filter_map().sum() 推断 `B` 的类型

Rust 生命周期 : Static reference lives to short to be fed into a function?

rust - 我正在安装 “parquet-schema: command not found”,尽管我已经完成了 cargo 安装拼花地板