gpt4 book ai didi

rust - 生命周期参数化结构上方法的正确类型是什么?

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

我有一个包含引用的结构,因此它有一个生命周期参数。我想传递这个结构的方法的函数指针。稍后,我将使用该结构的实例调用该函数。我在尝试存储函数指针时遇到了障碍,最终找到了这个解决方案:

struct Alpha<'a> { a: &'a u8 }

impl<'a> Alpha<'a> {
fn alpha(&self) -> u8 { *self.a }
}

struct Try1(fn(&Alpha) -> u8);
struct Try2(for<'z> fn(&Alpha<'z>) -> u8);
struct Try3<'z>(fn(&Alpha<'z>) -> u8);

fn main() {
Try1(Alpha::alpha); // Nope
Try2(Alpha::alpha); // Nope
Try3(Alpha::alpha);
}

不幸的是,这个解决方案不适用于我的实际情况,因为我想实现一个具有自己的生命周期概念的特征:

trait Zippy {
fn greet<'a>(&self, &Alpha<'a>);
}

impl<'z> Zippy for Try3<'z> {
fn greet<'a>(&self, a: &Alpha<'a>) { println!("Hello, {}", self.0(a)) }
}

产生错误:

error: mismatched types:
expected `&Alpha<'z>`,
found `&Alpha<'a>`

我觉得我不需要将结构 Try3 的生命周期与函数指针参数的生命周期联系起来,但编译器一定看到了一些我没有看到的东西。

最佳答案

不幸的是,函数alpha在结构上实现 Alpha有效地将结构的生命周期作为参数,尽管实际上并没有使用它。这是在具有生命周期的结构上定义方法的语法限制。因此,即使可以将指向它的指针作为 for<'z> fn(&Alpha<'z>) -> u8 , 不可能将其视为 fn(&Alpha) -> u8 ,即使定义表明这应该是可能的。

这可以通过定义一个函数来解决,该函数调用该方法并取一个指向它的指针:

fn workaround(a: &Alpha) -> u8 { Alpha::alpha(a) }
Try1(workaround);

事实上,反过来做可能更好,在函数中定义,调用函数的方法。然后当通过 fn(&Alpha) -> u8 调用函数时指针不需要第二次跳转到方法中,并且可以将对方法的调用内联为对函数的调用。

关于rust - 生命周期参数化结构上方法的正确类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122133/

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