如何 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
。
我用谷歌搜索,找到了 Cow
、Mem::take
和 UnSafe
之类的东西,但它们似乎不是这里的用例。
I wonder if there is a more efficient way other than copying the field, like move in C++.
嗯,是的,搬家了。但是移动需要拥有对象的所有权,这意味着您需要 probs()
的一个版本,它 消耗 对象以便 return 它的位。
或者 return 可变引用以便使用 mem::take
或 mem::swap
。
就像您在 C++ 中所做的那样,实际上,您不能将内容从 const 引用中移出(最多执行复制)。
这样的代码:
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
。
我用谷歌搜索,找到了 Cow
、Mem::take
和 UnSafe
之类的东西,但它们似乎不是这里的用例。
I wonder if there is a more efficient way other than copying the field, like move in C++.
嗯,是的,搬家了。但是移动需要拥有对象的所有权,这意味着您需要 probs()
的一个版本,它 消耗 对象以便 return 它的位。
或者 return 可变引用以便使用 mem::take
或 mem::swap
。
就像您在 C++ 中所做的那样,实际上,您不能将内容从 const 引用中移出(最多执行复制)。