相关疑难解决方法(0)

将 Option<&T> 转换为 Option<T>

我有一个为 int 做的函数:

fn some_to_value(src: Option<&int>) -> Option<int> {
    match src {
        Some(x) => Some(*x),
        None => None
    }
}
Run Code Online (Sandbox Code Playgroud)

我想让它通用(并且仍然在调用者级别使用“int”)。如果复制 T 的实例对我来说就可以了。所以我尝试这样做:

fn some_to_value<T>(src: Option<&T>) -> Option<T> {
    match src {
        Some(x) => Some(*x),
        None => None
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到:

error: cannot move out of dereference of `&`-pointer
Some(x) => Some(*x),
                ^~
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它会失败(我是初学者)。

一些上下文:我制作了一个 Option 的副本,因为我意识到在对“HashMap”进行“查找”之后,只要返回“查找”(一个包含对地图的项目)是活着的。

generics rust

5
推荐指数
1
解决办法
800
查看次数

获取向量的最后一个元素并将其推送到同一向量

我想做什么:

enum Test {
    Value1,
    Value2,
    Value3
}

fn main() {
    let mut test_vec: Vec<Test> = Vec::new();
    test_vec.push(Test::Value2);

    if let Some(last) = test_vec.last() {
        test_vec.push(*last);
    }
    //Wanted output: vector with [Test::Value2, Test::Value2]
}
Run Code Online (Sandbox Code Playgroud)

我明白,当我打电话时last(),它会返回Option<&Test> 所以它会借用test_vec直到if-let块结束.

我尝试了以下但没有成功:

if let Some(last) = test_vec.last().map(|v| v.clone()) {
    test_vec.push(*last);
}

//and

let last = test_vec.last().unwrap().clone();
test_vec.push(*last);
Run Code Online (Sandbox Code Playgroud)

vector rust

4
推荐指数
2
解决办法
2381
查看次数

如何从向量中克隆最后一个元素?

我正在尝试编写代码来获取某个向量的最后一个元素,并根据该元素执行不同的操作(包括向量的变异).

我试过这样的:

#[derive(Clone, PartialEq)]
enum ParseItem {
    Start,
    End,
}

let mut item_vec = vec![ParseItem::End];
loop {
    let last_item = *item_vec.last().clone().unwrap();
    match last_item {
        ParseItem::End => item_vec.push(ParseItem::Start),
        _ => break,
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:无法移出借来的内容
让last_item =*item_vec.last().clone().unwrap();

我认为通过克隆item_vec.last(),所有权问题将得到解决,但似乎没有.

如果我用这样的整数向量尝试相同的东西:

let mut int_vec = vec![0];
loop {
    let last_int = *int_vec.last().clone().unwrap();
    match last_int {
        0 => int_vec.push(1),
        _ => break,
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器不会抱怨借用.

为什么我的代码无法编译?

rust

3
推荐指数
1
解决办法
1686
查看次数

如何转换选项中的内部值?

我有一个Option包含一些 JSON 的。如果是Some,则必须转换内部 JSON,但如果是None,则必须保留None。

这就是我目前实施的方式:

struct One;
struct Other;

impl One {
    pub fn convert(&self) -> Other {
        Other {}
    }
}

fn example(attr: Option<One>) -> Option<Other> {
    match attr {
        Some(attr) => Some(attr.convert()),
        None => None,
    }
}
Run Code Online (Sandbox Code Playgroud)

我是新来的锈和不完全获得时使用的复杂性match,if let或时使用的?运营商。

我的实现是 Rust 惯用的吗?对我来说似乎比较冗长,而且看起来像一个到处都会出现的模式,所以我可以想象这可以更简洁地处理;是这样吗?

optional rust rust-2018

0
推荐指数
1
解决办法
598
查看次数

标签 统计

rust ×4

generics ×1

optional ×1

rust-2018 ×1

vector ×1