如何 return 不再使用而无需复制的结构的引用字段的值?

How to return the value of a reference field of a struct that is no longer used without copy?

这样的代码:

pub fn sample_from_categorical_logits(prob_logits: Tensor) -> (Tensor, Tensor) {
    let prob_obj = match prob_logits.size().len() {
        3 => Categorical::from_logits(prob_logits),
        2 => Categorical::from_logits(prob_logits.unsqueeze(1)),
        _ => panic!("illegal..."),
    };
    (prob_obj.sample(&[]), (*prob_obj.probs()).copy())//TODO: can copy be avoided?
}

我可以通过 prob_obj.prob() 在对象 prob_obj 的字段上获得不可变引用。现在我需要 return 它的值,因为我需要(只)读取这个值进行一些计算,并且 return 这个值和进一步计算的值。

Tensor 是第三个结构,没有实现 Copy 特征。

我知道我不能 return 本地对象的引用。但在这种情况下,由于我不再需要整个 prob_obj 对象,我想知道是否有比复制字段更有效的方法,例如 C++ 中的 move

我用谷歌搜索,找到了 CowMem::takeUnSafe 之类的东西,但它们似乎不是这里的用例。

I wonder if there is a more efficient way other than copying the field, like move in C++.

嗯,是的,搬家了。但是移动需要拥有对象的所有权,这意味着您需要 probs() 的一个版本,它 消耗 对象以便 return 它的位。

或者 return 可变引用以便使用 mem::takemem::swap

就像您在 C++ 中所做的那样,实际上,您不能将内容从 const 引用中移出(最多执行复制)。