函数引用:预期的绑定生命周期参数,找到的具体生命周期[E0271]

2023-12-24

关于这个主题已经有很多线程,但我无法看到讨论的问题是否适用于我的特定问题。

我有一个存储 a 的结构name and a callback功能。剥离到问题看起来像这样:

pub struct Command<'a> {
    name: &'a str,
    callback: &'a Fn(&[&str]) -> ()
}

impl <'a> Command<'a> {
    pub fn new(name: &'a str, callback: &'a Fn(&[&str]) -> ()) -> Command<'a> {
        Command {
            name: name,
            callback: callback
        }
    }
}

我想要做的是存储与名称关联的回调函数(以及将来可能会出现的更多内容)。

但是当我尝试像这样使用这段代码时:

fn main() {
    let play_callback = |args| {
        println!("Playing something.");
        for arg in args {
            println!("{}", arg);
        }
    };
    let play_command = Command::new("play", &play_callback);
}

我收到以下错误消息:

src/main.rs:22:42: 22:56 error: type mismatch resolving `for<'r, 'r> <[closure@src/main.rs:16:22: 21:3] as std::ops::FnOnce<(&'r [&'r str],)>>::Output == ()`:
 expected bound lifetime parameter ,
    found concrete lifetime [E0271]
src/main.rs:22  let play_command = Command::new("play", &play_callback);
                                                        ^~~~~~~~~~~~~~

我尝试像这样内联闭包

fn main() {
    let play_command = Command::new("play", &|args| {
        println!("Playing something.");
        for arg in args {
            println!("{}", arg);
        }
    });
}

但后来我收到另一个错误

src/main.rs:16:47: 21:7 error: borrowed value does not live long enough

我相信我明白为什么我会得到这个。

我尝试使用泛型类型参数Command在切换到函数引用之前首先存储在我的Command结构,但是当我想初始化一个HashSet像这样的命令对象:

let mut commands: HashSet<Command> = HashSet::new();

编译器希望我指定通用参数,我认为我不能这样做,因为这意味着我只能在我的所有Command对象。

所以我的问题是:我怎样才能实现我想要的目标以及实现这一目标的最佳方法是什么(以及为什么)?


简单的解决办法(由 ljedrz 提供)是args: &[&str]在这种情况下不被推断。但是,这可能不足以解决您的问题。

当您使用对某些特征的引用作为函数参数时,它将被视为特征对象。在这种情况下,&Fn是一个引用堆栈上的闭包的特征对象。

特征对象的一个​​简单类比是用其他语言实现接口的对象。

然而,生命周期对于特征对象的工作方式有点不同。您可以将它们视为与通常的所有权流程“分离”的。如果我们要注释Fn特征对象生命周期'c在您的示例中,我们将得到以下代码:

pub struct Command<'a> {
    name: &'a str,
    callback: &'a for<'c> Fn(&'c [&'c str]) -> ()
}

impl <'a> Command<'a> {
    pub fn new<'r>(name: &'r str, callback: &'r for<'c> Fn(&'c [&'c str]) -> ()) -> Command<'r> {
        Command {
            name: name,
            callback: callback
        }
    }
}

fn main() {
    let play_callback = |args: &[&str]| {
        println!("Playing something.");
        for arg in args {
            println!("{}", arg);
        }
    };
    let play_command = Command::new("play", &play_callback);
}

在上面的代码中,生命周期'c描述了回调函数将被调用的范围。

然而,上面的代码不太实用。它将命令与创建闭包的作用域耦合起来(记住,特征对象引用该作用域中的闭包)。所以你不能退出你的函数Command被创建,因为这会破坏闭包!

可能的解决方案是将闭包存储在堆上,在Box<Fn(&[&str])>。盒子(堆内存)中特征对象的生命周期由盒子的创建和销毁控制,因此它是最广泛的可能('static).

pub struct Command<'a> {
    name: &'a str,
    callback: Box<Fn(&[&str]) -> ()>
}

impl <'a> Command<'a> {
    pub fn new<'r>(name: &'r str, callback: Box<Fn(&[&str]) -> ()>) -> Command<'r> {
        Command {
            name: name,
            callback: callback
        }
    }
}

fn main() {
    let play_callback = |args: &[&str]| {
        println!("Playing something.");
        for arg in args {
            println!("{}", arg);
        }
    };
    let play_command = Command::new("play", Box::new(play_callback));
}

在上面的例子中,闭包将是moved盒子创建时放入盒子中,并与一起销毁Command.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数引用:预期的绑定生命周期参数,找到的具体生命周期[E0271] 的相关文章

随机推荐

  • XML 架构 (XSD) 中 xsd:union 的用途是什么?

    我出于某种目的正在解析 XSD 但面临一些 XSD 节点的问题 XSD 中 union 的用途是什么以及为什么使用它 它是否用于对 XML 施加某种限制 我正在附加联合和简单类型节点 请解释一下为什么使用它
  • 条形图中每个条形上的叠加线是什么?

    我正在尝试通过数据可视化来学习自己 当我浏览条形图时 我遇到了以下问题 在图表中 条形字符中的每个条形上都有一条垂直的黑线 那条覆盖的黑线到底意味着什么 感谢您的帮助 这个看起来像垂直的误差线 https en wikipedia org
  • 做 Laravel 教程,得到“未找到基表或视图:1146 表‘sdbd_todo.migrations’不存在”

    工作通过本教程 https www flynsarmy com 2013 12 creating a basic todo application with laravel 4 part 1 我执行以下步骤 您现在应该可以根据需要多次调用
  • 您可以从 p:ajax 侦听器更新 h:outputLabel 吗?

    我尝试使用 p ajax 标签 然后在该侦听器中设置一个名为 periodRendered 的值 然后我尝试通过 p ajax 标签的更新来更新 h outputLabel 标签 它没有更新 ajaxily 我认为这是因为 primefac
  • 按钮 ControlTemplate 和圆角

    我有一个按钮控制模板 我想制作带有圆角的按钮 我该怎么做 我尝试使用 CornerRadius 作为边框中的按钮 但它不起作用 按钮的背景已设置为具有角边框的图像 并且按钮看起来很尴尬 因为我无法设置按钮的角 请尝试以下操作
  • Flexbox的align-self属性没有转换?

    我尝试创建一个吗啡 按钮 它可以在另一个菜单上滑动 这个想法是基于 Codrops变形按钮概念 http tympanus net Development ButtonComponentMorph index5 html 现在已经差不多设置
  • 结构体中变量名前的点是什么意思?

    查看linux内核源代码 我发现了这一点 static struct tty operations serial ops open tiny open close tiny close write tiny write write room
  • Python 中循环链表的帮助

    我正在尝试制作一个循环单链表 我希望能够修改我的代码以获得单一喜欢的列表 但我遇到了一些麻烦 对于我的链接列表 我有 class Link object def init self data next None self data data
  • 在运行时获取 RecyclerView 子视图的高度

    我正在尝试制作一个可扩展的 TextView 当用户按下按钮时它会展开 折叠 TextView 和 ImageButton 位于 CardView 中 该 CardView 添加到 RecyclerView 中 展开 折叠效果很好 但现在我
  • ViewPager2 崩溃

    我正在将高级导航组件与 BottomNavigationView 一起使用 In one tab我有ViewPager2 当我第一次单击该选项卡时 效果很好 尽管第二次 来吧 该选项卡应用程序不断崩溃 下面是崩溃日志 我怎样才能解决这个问题
  • 按下后退按钮时提示用户

    哪个是询问用户单击后退按钮时是否要退出应用程序的好地方 我考虑过onPause and onStop 但是只要应用程序落后于其他应用程序 这些方法就会触发 更新 应用程序还应该询问用户是否尝试通过按钮 在应用程序本身中 退出应用程序 而不是
  • 提取第二层嵌套字典中的所有键

    我想提取 2d 字典第二级中的所有键 但 python 解释器返回 NameError 我的预期结果是 aa bb cc aaa bbb ccc gt gt gt adict defaultdict
  • 在c#中如何检查文件是否正在使用? [复制]

    这个问题在这里已经有答案了 如何检查我正在处理的 Excel 文件 操作其数据 删除它或覆盖它 是否正在被另一个程序使用 以及如何从中释放它 请指导我使用 C 尝试用 用于写作 的标志打开 如果失败 该文件将被其他进程 获取 FileStr
  • 使用 JQuery 发布 JSON 并设置 HTTP 内容类型 - 'application /json'

    我正在使用 jquery 将 Json 数据发布到服务器 但是 当我发出如下的帖子请求时 ajax type POST url uri data jsonStrJson contentType application json succes
  • 从剪贴板(从 Excel 粘贴)获取包含重音字符的 CSV 数据

    SCENARIO 我的用户将从 Excel 复制单元格 从而将其放入剪贴板 我的应用程序将从剪贴板检索这些单元格 问题 我的代码从剪贴板检索 CSV 格式 但是 如果原始 Excel 内容包含像 带变音符号的字符 这样的字符 则检索到的 C
  • 如何将对象传递到 Thymeleaf 中的模式对话框?

    我有一个thymeleaf在表中显示数据库内容 人员 的页面 tr td td td td td td td td tr
  • 使用反射时如何确定方法是否返回动态类型?

    使用反射时 可以检查字段 属性 索引器和参数的 DynamicAttribute 属性 以确定它们是否具有动态类型 但是 这不适用于方法 即使它们返回 动态 但它们没有属性 并且返回类型是 对象 并且也没有属性 Visual Studio
  • MySQL 上的死锁与锁等待超时 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 谁能详细解释一下 MySQL 5 1 上发现的死锁和锁等待错误的区别 难道只是一样吗 什么时候会发生死锁错误 什么时候会发生lockwait超时 A
  • 是否可以将方法参数传递给方法上的注释?

    假设我们有这个带有注释的方法 Cached key search id public static List
  • 函数引用:预期的绑定生命周期参数,找到的具体生命周期[E0271]

    关于这个主题已经有很多线程 但我无法看到讨论的问题是否适用于我的特定问题 我有一个存储 a 的结构name and a callback功能 剥离到问题看起来像这样 pub struct Command lt a gt name a str