我想创建一个带有参数x: uint
的函数,返回WeightedChoice
,其中包含权重'a'
和'b'
的权重x
和分别为1u
。我怎么能这样做?
这显然是错误的,但只是想知道我在尝试什么:
use std::rand::distributions::{WeightedChoice, Weighted};
fn make_wc<'a>(x: uint) -> WeightedChoice<'a, char> {
let mut items = [Weighted { weight: x, item: 'a' },
Weighted { weight: 1, item: 'b' }];
WeightedChoice::new(???)
}
令我困惑的部分是终身参数。据我所知,我无法在函数内部创建任何生命周期'a
,但WeightedChoice::new
的参数需要类型为&'a mut [Weighted<char>]
。
答案 0 :(得分:3)
是的,你是对的,不可能创建任何指定为函数参数的生命周期。
可以返回WeightedChoice<'static, char>
,但需要使用&'static mut [Weighted<T>]
,这不适合您的用例(如果可能的话)。
你可以做的是&#34;封装&#34; WeightedChoice
数据放入您自己的结构中,该结构具有生成WeightedChoice
的方法:
use std::rand::distributions::{Weighted, WeightedChoice};
struct OwningWc<T> {
items: Vec<Weighted<T>>
}
impl<T: Clone> OwningWc<T> {
#[inline]
pub fn new(items: Vec<Weighted<T>>) -> OwningWc<T> {
OwningWc { items: items }
}
#[inline]
pub fn get(&mut self) -> WeightedChoice<T> {
WeightedChoice::new(self.items[mut])
}
}
然后你会像这样使用它:
fn make_wc(x: uint) -> OwningWc<char> {
let items = vec![Weighted { weight: x, item: 'a' },
Weighted { weight: 1, item: 'b' }];
OwningWc::new(items)
}
let owc = make_wc(10);
let wc: WeightedChoice<char> = owc.get();
如果您不需要通用性,则可以优化OwningWc
结构,例如[Weighted<char>, ..2]
字段而不是Vec<Weighted<T>>
。在这种情况下,你甚至不需要动态分配。