rust-based-os-comp2022 icon indicating copy to clipboard operation
rust-based-os-comp2022 copied to clipboard

生命周期HRTB相关的问题

Open Mota-Link opened this issue 2 years ago • 7 comments

生命周期中的HRTB,概括地说,应该用于哪些场景呢? 我知道在如下的场景中:

fn foo<'a,T>(f: T)
where
     T: Fn(&'a i32) -> &'a i32,
{
    let x = 0;
    f(&x);   //error: `x` does not live long enough
}

应该使用HRTB:

fn foo<T>(f: T)
where
    for<'a> T: Fn(&'a i32) -> &'a i32,
{
    let x = 0;
    f(&x);
}

但似乎省略该生命周期标注,也能有相同的效果:

fn foo<T>(f: T)
where
    T: Fn(&i32) -> &i32,
{
    let x = 0;
    f(&x);
}

所以使用HRTB的意义是什么呢?还是说,当省略闭包的生命周期参数时,隐式使用了HRTB来推导?求解惑

Mota-Link avatar Jul 03 '22 02:07 Mota-Link

我是学java的,我的理解是HRTB有些像java中的工厂模式吧,比如你有一大堆类型(rust里也许没有类型,但是有struct)例如A、B、C、D处理不同的业务,每种业务都会执行一个名为call()的方法,但是你想使用一个入口来控制所有的类型来执行这些业务,那么你就可以写一个这样的HRTB来执行A、B、C、D的call方法。随着业务的拓展,比如你又有了一个E业务,那么你就不需要重新修改代码了,只需要再E业务中实现call()就可以了,这算是一种程序设计思想,对修改关闭,对拓展开放的程序设计思想。

makexiao113 avatar Jul 03 '22 16:07 makexiao113

我是学java的,我的理解是HRTB有些像java中的工厂模式吧,比如你有一大堆类型(rust里也许没有类型,但是有struct)例如A、B、C、D处理不同的业务,每种业务都会执行一个名为call()的方法,但是你想使用一个入口来控制所有的类型来执行这些业务,那么你就可以写一个这样的HRTB来执行A、B、C、D的call方法。随着业务的拓展,比如你又有了一个E业务,那么你就不需要重新修改代码了,只需要再E业务中实现call()就可以了,这算是一种程序设计思想,对修改关闭,对拓展开放的程序设计思想。

描述得不是很准确,希望各位大佬轻喷,如果有啥不对得地方请指出来,我会虚心学习得

makexiao113 avatar Jul 03 '22 16:07 makexiao113

我是学java的,我的理解是HRTB有些像java中的工厂模式吧,比如你有一大堆类型(rust里也许没有类型,但是有struct)例如A、B、C、D处理不同的业务,每种业务都会执行一个名为call()的方法,但是你想使用一个入口来控制所有的类型来执行这些业务,那么你就可以写一个这样的HRTB来执行A、B、C、D的call方法。随着业务的拓展,比如你又有了一个E业务,那么你就不需要重新修改代码了,只需要再E业务中实现call()就可以了,这算是一种程序设计思想,对修改关闭,对拓展开放的程序设计思想。

我查了一下工厂模式,感觉跟HRTB不是一个东西😂? 我理解的HRTB只是一种声明生命周期标注的方式,应该不算一个设计模式吧?

Mota-Link avatar Jul 04 '22 07:07 Mota-Link

我是学java的,我的理解是HRTB有些像java中的工厂模式吧,比如你有一大堆类型(rust里也许没有类型,但是有struct)例如A、B、C、D处理不同的业务,每种业务都会执行一个名为call()的方法,但是你想使用一个入口来控制所有的类型来执行这些业务,那么你就可以写一个这样的HRTB来执行A、B、C、D的call方法。随着业务的拓展,比如你又有了一个E业务,那么你就不需要重新修改代码了,只需要再E业务中实现call()就可以了,这算是一种程序设计思想,对修改关闭,对拓展开放的程序设计思想。

我查了一下工厂模式,感觉跟HRTB不是一个东西😂? 我理解的HRTB只是一种声明生命周期标注的方式,应该不算一个设计模式吧?

我的理解是生命周期是一个东西,HRTB是一个东西,例子里的不同写法只是声明生命周期和不声明生命周期的写法区别,重点应该是HRTB的使用场景,而不是生命周期的声明

makexiao113 avatar Jul 04 '22 07:07 makexiao113

我的理解是生命周期是一个东西,HRTB是一个东西,例子里的不同写法只是声明生命周期和不声明生命周期的写法区别,重点应该是HRTB的使用场景,而不是生命周期的声明

还是不太理解,能举个例子吗?

Mota-Link avatar Jul 04 '22 08:07 Mota-Link

我是学java的,我的理解是HRTB有些像java中的工厂模式吧,比如你有一大堆类型(rust里也许没有类型,但是有struct)例如A、B、C、D处理不同的业务,每种业务都会执行一个名为call()的方法,但是你想使用一个入口来控制所有的类型来执行这些业务,那么你就可以写一个这样的HRTB来执行A、B、C、D的call方法。随着业务的拓展,比如你又有了一个E业务,那么你就不需要重新修改代码了,只需要再E业务中实现call()就可以了,这算是一种程序设计思想,对修改关闭,对拓展开放的程序设计思想。

我查了一下工厂模式,感觉跟HRTB不是一个东西😂? 我理解的HRTB只是一种声明生命周期标注的方式,应该不算一个设计模式吧?

我的理解是生命周期是一个东西,HRTB是一个东西,例子里的不同写法只是声明生命周期和不声明生命周期的写法区别,重点应该是HRTB的使用场景,而不是生命周期的声明

还是不太理解,能举个例子吗? 看一下这个视频吧,我也不是能说得很清楚 https://www.bilibili.com/video/BV1hp4y1k7SV?p=104

makexiao113 avatar Jul 04 '22 09:07 makexiao113

看一下这个视频吧,我也不是能说得很清楚 https://www.bilibili.com/video/BV1hp4y1k7SV?p=104

视频里的完全不是HRTB啊,参考这个文章: https://nomicon.purewhite.io/hrtb.html

Mota-Link avatar Jul 04 '22 11:07 Mota-Link