gpt4 book ai didi

function - 如何在泛型函数中构造具体类型?

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

我需要用什么替换/* type */这样o_f可能等于 None , Some(a) , Some(b) , 或 Some(/* a different function with the same signature */) ?

fn func<T: Copy + Ord>(x: &mut Option<Box<Node<T>>>)
{
let mut o_f: /* type */ = None;
let mut result_of_f: Option<bool> = None;
let mut o_b_n_num = Some(Box::new(Node::new(1)));

// ...

if let Some(f) = o_f
{
result_of_f = Some(f(x) && f(&mut o_b_n_num));
}

// ...
}

最佳答案

你试图做的事情是不可能的。你有一个函数泛型超过 T但在内部,您尝试使用具体类型 i32 . Rust 根据调用它们的类型对泛型函数进行单态化。以这个程序为例:

fn func<F, T>(f: F, t: T)
where F: Fn(T)
{
f(t);
}

struct S;
struct R;

fn main() {
func(|x| {}, S);
func(|x| {}, R);
}

将被编译为:

fn func_S(f: impl Fn(S), s: S)
{
f(s);
}

fn func_R(f: impl Fn(R), r: R)
{
f(r);
}

struct S;
struct R;

fn main() {
func_S(|s| {}, S);
func_R(|r| {}, R);
}

这一切都很好,但是如果我们返回并将第一个函数更改为此(这基本上是你想要做的):

fn func<F, T>(f: F, t: T)
where F: Fn(T)
{
f(t);
f(1); // concrete type i32, not type T
}

struct S;
struct R;

fn main() {
func(|x| {}, S);
func(|x| {}, R);
}

现在它不会编译,但如果我们想象它会编译,那么它会像这样:

fn func_S(f: impl Fn(S), s: S)
{
f(s);
f(1); // error! f expects S not i32
}

fn func_R(f: impl Fn(R), r: R)
{
f(r);
f(1); // error! f expects R not i32
}

struct S;
struct R;

fn main() {
func_S(|s| {}, S);
func_R(|r| {}, R);
}

你明白这根本没有意义吗?您正在尝试传递 i32到期望 S 的函数和 R .

现在,您有几个选择。如果你想要一些只是 i32 的数据结构s 那么你不需要使它成为通用的并且可以只为 i32 定义它s。如果你想要一个通用结构,如果缺少某个节点,并且你想用一个“默认”节点填充它(也许在 Node<i32> 的情况下,默认节点是 Node::new(1) )那么你可以绑定(bind) TDefault并写出这样的东西:

#[derive(Default)]
struct Node<T: Default>(T);

#[derive(Default)]
struct S;
#[derive(Default)]
struct R;

fn func<F, T>(f: F, t: Option<Node<T>>)
where T: Default, F: Fn(Node<T>)
{
f(t.unwrap_or_default());
}

fn main() {
func(|x| {}, Some(Node(S)));
func(|x| {}, Some(Node(R)));
func(|x: Node<i32>| {}, None);
}

现在你的函数在 T 上是真正通用的。并处理所有 Node<T> 的情况包括 Node<i32> .

也可以看看
  • “Expected type parameter” error in the constructor of a generic struct
  • 关于function - 如何在泛型函数中构造具体类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61789379/

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