acodercat 发表于 2019-11-28 16:38
Tags:借用
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c6f99e87b6a52c07915a7981d7a5991e
稍微修改了一下实现,如果要用这种写法的话可以写成这样。 其中的find函数是关键点,你的parents 和 rank 同属于一个self,所以你的find作为成员函数,编译器中会看作你从self中“借走”了一段数据,并不会在乎这段数据是不是和rank无关,这也就是他认为你在不可变借用后用了可变借用的原因,这个问题的解决方法是“缩小”所属权,把原来的 &self 变成 &self.parents 操作,这样可以告诉编译器后面用的self.rank 和这个 不是一个数据段 , 不存在冲突。 为了达成这样find要写成成员函数并加上生命周期,find函数理论上不需要被外部所调用,所以可以不需要pub。 还可以注意到还是会有warning的,毕竟把parents的一部分借出来的同时还想要插东西进去。
评论区
写评论https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c6f99e87b6a52c07915a7981d7a5991e
稍微修改了一下实现,如果要用这种写法的话可以写成这样。 其中的find函数是关键点,你的parents 和 rank 同属于一个self,所以你的find作为成员函数,编译器中会看作你从self中“借走”了一段数据,并不会在乎这段数据是不是和rank无关,这也就是他认为你在不可变借用后用了可变借用的原因,这个问题的解决方法是“缩小”所属权,把原来的 &self 变成 &self.parents 操作,这样可以告诉编译器后面用的self.rank 和这个 不是一个数据段 , 不存在冲突。 为了达成这样find要写成成员函数并加上生命周期,find函数理论上不需要被外部所调用,所以可以不需要pub。 还可以注意到还是会有warning的,毕竟把parents的一部分借出来的同时还想要插东西进去。