如何从函数返回WeightedChoice?

时间:2014-10-07 07:10:14

标签: rust

我想创建一个带有参数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>]

1 个答案:

答案 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>>。在这种情况下,你甚至不需要动态分配。