关于这个主题的Myprevious question被正确地识别为XY problem.的实例
我正试图创建一个资源管理板条箱来决定谁可以租用地板。公共接口(当前)看起来如下:
pub struct Bid<T> {
max_bid: TokenPerNanoSecond,
budget: Token,
data: T
}
/// Returns a vector of tuples of (T, time of rent end, tokens spent)
pub fn who_rents_the_flooble<'a, T>(
mut bids: Vec<&'a mut Bid<T>>
) -> Vec<(T, NanoSecond, Token)> {
let mut output = vec![];
let mut now = NanoSecond::from(0);
// while bids.len() > 0 {
// run a mini auction to work out who wins
// increment now by the duration
// append winner's data, now and amount spent to output
// subtract amount spent from winner's budget
// remove bids with no budget left
// }
output
}
Token
、NanoSecond
和TokenPerNanoSecond
是u64
的新类型,它们的算术关系已完全定义;它们主要是因为我代数不好才出现的,不希望因为我的基本代数错误和语义不同的数据的合并而出现细微的错误。T
是一个纯粹不透明的东西。这是C回调的void *
,作为调用方识别输入和输出之间关系的一种方式。然而,
Vec<&'a mut Bid<T>>
并没有真正做到我需要它做的事情。为了实现“小型拍卖”,我需要重新订购Vec<&'a Bid<T>>
副本,这需要获得引用的所有权,并且在我下一次需要对bids
s进行变异时会留下一点麻烦。我的建筑应该是什么样的?
如果这还不够,请注意,我正在尝试在Rust中重新实现this bad code。
最佳答案
所有这些问题都可以通过获得向量的所有权来解决;您的原型应该如下所示:
pub fn who_rents_the_flooble<T>(
mut bids: Vec<Bid<T>>
) -> Vec<(T, NanoSecond, Token)>
通过值传递而不是通过引用来解决问题。
关于types - 我该如何表示这些数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56756713/