gpt4 book ai didi

rust - 如何使用特征对象来引用具有泛型方法的结构

转载 作者:行者123 更新时间:2023-11-29 07:50:43 25 4
gpt4 key购买 nike

关于这个问题,Storing a closure in a HashMap ,我了解到正确地将闭包传递给函数需要函数是通用的,并且采用实现 Fn、FnMut 或 FnOnce 特征的任何类型。

在作为学习练习从 C++ 实现库的一部分时,我需要某种类似这样的类型抽象。

use std::collections::HashMap;

struct Event;

trait IObject {
fn makeFunc<F : FnMut(&Event)>(&mut self, s : &str, f : F);
}

struct Object1<'a> {
m_funcs : HashMap<String, Box<FnMut(&Event) + 'a>>
}

impl <'a> Object1<'a> {
fn new() -> Object1<'a> {
Object1 {m_funcs : HashMap::new()}
}
}

impl <'a> IObject for Object1<'a> {
fn makeFunc<F : FnMut(&Event) + 'a>(&mut self, s: &str, f: F) {
self.m_funcs.insert(String::from_str(s), Box::new(f));
}
}

fn main() {
let obj : &IObject = &Object1::new();
println!("Hello, world!");
}

但是,返回的错误表明 IObject 不能是特征对象,因为它包含一个带有泛型参数的方法。但是,要完全将闭包传递给函数,我需要泛型。有人可以告诉我如何实现我正在寻找的抽象,同时仍然能够将闭包传递给函数吗?

最佳答案

你无法绕过这个;静态和动态调度不要混用。静态分派(dispatch)(泛型)所做的单态化根本无法与动态分派(dispatch)(特征对象)中使用的 vtable 一起工作。

两者之一必须去:要么使用IObject作为特征对象或通用函数参数,有利于接受 Box<FnMut(&Event) + 'a> .

顺便说一下,注意你的 IObject实现与特征不匹配——特征没有给出 F 的生命周期限制,你的实现在哪里。您需要添加 'a无论如何作为特征定义的泛型(泛型生命周期对于特征对象是可以的)。

关于rust - 如何使用特征对象来引用具有泛型方法的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29202698/

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