有没有一种安全的方法可以将相同的代码重用于函数的不可变和可变的变体?

时间:2019-06-25 21:22:26

标签: generics reference rust immutability mutability

我做了一些搜索,发现了this Reddit post from four years ago,但不安全的代码除外:

fn find_mut <'a> (&'a mut self, elem: &T) -> Option<&'a mut Node<T>> {
    unsafe{std::mem::transmute(self.find(elem))}
}   

或宏,我想不出任何方法来做到这一点。

问题的其他重述:

  • 使功能具有可变性。
  • 可变性修饰符多态性。

现在有办法吗?


动机,以防万一这是另一个XY问题:我想编写一个处理引用向量的函数,读取但不修改它们,并且在需要的情况下我都想使用这些函数有&T&mut T

1 个答案:

答案 0 :(得分:1)

根据您在消息末尾所描述的动机,我的理解是,您希望使用一个功能并且不修改基础的Vec<&T>来检查Vec<&mut T>T s。这是您想要的吗?请注意,我之所以使用切片的引用,是因为它比参数的引用更习惯用法,因为后者比矢量的引用更惯用。

Playground

use std::ops::Deref;

struct Foo;

fn do_stuff(_: &Foo) {}

fn process<T>(v: &[T])
where
    T: Deref<Target = Foo>,
{
    for x in v.iter().map(|x| x.deref()) {
        do_stuff(x);
    }
}

fn main() {
    process(&[&Foo]);
    process(&[&mut Foo]);
}

使用Borrow代替Deref,您也可以传递&[Foo]