我在此主题上的previous 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>>
的{{1}}副本,这需要获得引用的所有权,并且在我下次需要使用时会有点卡住突变bids
。
我的架构应该是什么样的?
如果这还不够,请注意我正在尝试在Rust中重新实现this bad code。
答案 0 :(得分:0)
所有这些问题都可以简单地通过拥有向量的所有权来解决;您的原型应如下所示:
pub fn who_rents_the_flooble<T>(
mut bids: Vec<Bid<T>>
) -> Vec<(T, NanoSecond, Token)>
通过值而不是引用来解决问题。