相关疑难解决方法(0)

如何解决Rust中的“返回引用当前函数拥有的数据的值”错误?

我正在尝试对生成随机表达式的二叉树进行编码。我需要随机数和一组函数。我收到一个向量,其中包含树中表达式的功能和深度。在运算符向量中,我还包括一个“ ELEM”字符串,该字符串用于从向量中选择一个随机元素,然后将其更改为浮点型。

似乎我仍然不了解借用,移动和所有权的确切用途,因为它是递归函数,它显示错误,指出值已借用并且无法返回局部变量。

use rand::Rng;

struct Expression_Node<'a> {
    val: &'a str,
    left: Option<Box<Expression_Node<'a>>>,
    right: Option<Box<Expression_Node<'a>>>,
}

fn Create_Expression(
    operators: Vec<&str>,
    p: i32,
) -> std::option::Option<std::boxed::Box<Expression_Node<'_>>> {
    if p == 0 {
        let value = String::from(rand::thread_rng().gen::<f64>().to_string());
        let value2: &str = value.as_ref();
        //println!("{:?}", value);
        let new_node = Expression_Node {
            val: value2,
            left: None,
            right: None,
        };
        return Some(Box::new(new_node));
    }
    let value: &str = *rand::thread_rng().choose(&operators).unwrap();
    println!("VAL: {:?}", value);
    if value == "ELEM" {
        let value = rand::thread_rng().gen::<f64>().to_string();
    }

    let new_node = Expression_Node { …
Run Code Online (Sandbox Code Playgroud)

rust

6
推荐指数
1
解决办法
4025
查看次数

无法返回字符串切片向量:借用的值存在的时间不够长

我是 Rust 的新手,我在使用借用检查器时遇到了一些麻烦。我不明白为什么这段代码不能编译。抱歉,如果这与之前回答的问题很接近,但我似乎无法在我看过的其他问题中找到解决方案。

我理解将本地字符串作为切片(&str)返回的相似性,但在这种情况下,它只是返回一个字符串,不足以让我对我试图返回向量的代码进行推理。据我所知,我试图返回对str将在功能块末尾超出范围的类型的引用,所以我应该将该向量映射&str为向量String吗?我不太关心转换&strString. 首先,我只想让它工作。

这是代码,错误在lex函数中。

use std::io::prelude::*;
use std::fs::File;
use std::env;

fn open(mut s: &mut String, filename: &String) {
    let mut f = match File::open(&filename) {
        Err(_) => panic!("Couldn't open file"),
        Ok(file) => file,
    };
    match f.read_to_string(&mut s) {
        Err(_) => panic!("Couldn't read file"),
        Ok(_) => println!("File read successfully"),
    };

}

fn lex(s: &String) -> Vec<&str> {
    let token_string: String = s.replace("(", " ( ") …
Run Code Online (Sandbox Code Playgroud)

vector rust borrowing

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

struct中可变元素的生命周期

如何在一个struct?中定义一个可变元素?如果我有以下示例:

struct User<'a> {
    reference: String,
    email: String,
    addresses: &'a mut Vec<Address>
}

struct Address {
    street: String,
    city: String
}

fn main() {

    let mut users = Vec::new();
    users.push(User {
        reference: "ref".to_string(),
        email: "test@test.com".to_string(),
        addresses: &mut Vec::new()
    });

}
Run Code Online (Sandbox Code Playgroud)

...它会产生错误:

src/main.rs:18:19: 18:29 error: borrowed value does not live long enough
src/main.rs:18      addresses: &mut Vec::new()
                                    ^~~~~~~~~~
src/main.rs:14:29: 21:2 note: reference must be valid for the block suffix following statement 0 at 14:28...
src/main.rs:14  let mut users = Vec::new(); …
Run Code Online (Sandbox Code Playgroud)

rust

4
推荐指数
1
解决办法
253
查看次数

在Rust中只拆分一次字符串

我想只用分隔符将字符串拆分一次并将其放入元组中.我试过了

fn splitOnce(in_string: &str) -> (&str, &str) {
    let mut splitter = in_string.split(':');
    let first = splitter.next().unwrap();
    let second = splitter.fold("".to_string(), |a, b| a + b); 
    (first, &second)
}
Run Code Online (Sandbox Code Playgroud)

但我一直被告知,second活得不够久.我想这是因为splitter它只存在于功能块内部,但我不确定如何解决这个问题.如何强制second进入功能块之外的现有?或者是否有更好的方法只分裂一次字符串?

rust

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

to_string() 导致错误“借来的价值活得不够长”

为什么会to_string()导致borrowed value does not live long enough错误?下面的例子:

use std::collections::HashMap;

struct Foo {
    id: Option<usize>,
    name: String
}

fn main() {

    let foos = getFoos();

    for foo in foos {
        let mut map = HashMap::new();
        map.insert("name", &foo.name);
        map.insert("id", &foo.id.unwrap().to_string());
    }

}

fn getFoos() -> Vec<Foo> {
    Vec::new()
}
Run Code Online (Sandbox Code Playgroud)

错误:

src/main.rs:15:27: 15:54 error: borrowed value does not live long enough
src/main.rs:15         map.insert("id", &foo.id.unwrap().to_string());
                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:13:38: 16:6 note: reference must be valid for the block suffix following statement 0 …
Run Code Online (Sandbox Code Playgroud)

lifetime rust borrow-checker

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

返回引用当前函数拥有的数据的值

此代码引发关于从函数返回引用的错误:

fn sha512_256_digest(str: &[u8]) -> &[u8] {
    let x = digest::digest(&digest::SHA512_256, str);
    x.as_ref()
}
Run Code Online (Sandbox Code Playgroud)

在这里返回xas_ref()值的正确方法是什么?

rust

3
推荐指数
2
解决办法
3138
查看次数

as_slice产生"不够活"的错误

我有以下功能:

    fn i_to_str(&self, i: int) -> &'a str {
        return i.to_string().as_slice();
    }
Run Code Online (Sandbox Code Playgroud)

error: borrowed value does not live long enough由于as_slice生命周期,此代码正在生成.有没有人知道是否有一些解决方法可以实现这一目标?

rust

2
推荐指数
1
解决办法
224
查看次数

有效地获取借用引用的所有权以从函数返回

我正在尝试编写一个简单的prompt函数,它返回一个输入字符串而不带尾随换行符,但我无法返回我的结果,因为它的input寿命不够长。我知道这String::trim_right_matches是返回对 的一部分的借用引用input: String,但我不知道如何获得该数据的所有权或以某种方式复制它以返回它。

我已经转了几个小时了,但没有运气,尽管我知道这种“与借用检查器的斗争”是 Rust 新手的必经之路,所以我想我并不孤单。

use std::io;
use std::io::Write;

fn main() {
    println!("you entered: {}", prompt("enter some text: "));
}

fn prompt(msg: &str) -> &str {
    print!("{}", msg);

    io::stdout().flush()
        .ok()
        .expect("could not flush stdout");

    let mut input = String::new();

    io::stdin()
        .read_line(&mut input)
        .expect("failed to read from stdin");

    input.trim_right_matches(|c| c == '\r' || c == '\n')
}
Run Code Online (Sandbox Code Playgroud)

直觉告诉我我需要fn prompt(prompt: &str) -> str代替-> &str,但我无法以编译器接受的方式实现这一点。

error: `input` does not live …
Run Code Online (Sandbox Code Playgroud)

return lifetime rust

2
推荐指数
1
解决办法
6199
查看次数

是否可以构建一个引用环境变量的 &amp;str HashMap?

我正在尝试制作环境变量的只读映射。

fn os_env_hashmap() -> HashMap<&'static str, &'static str> {
    let mut map = HashMap::new();
    use std::env;
    for (key,val) in env::vars_os() {
        let k = key.to_str();
        if k.is_none() { continue } 
        let v = val.to_str();
        if v.is_none() { continue }
        k.unwrap();
        //map.insert( k.unwrap(), v.unwrap() );
    }
    return map;
}
Run Code Online (Sandbox Code Playgroud)

如果没有关于 key、val、k 和 v 是本地的编译器错误,似乎无法取消对底部附近的“插入”行的注释。

也许可以通过使用 String 而不是 str 来修复编译器错误,但 str 似乎非常适合只读结果。

随意建议一个更惯用的方法来做到这一点。

rust

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

无法将字符串拆分为具有显式生存期的字符串切片,因为字符串的活动时间不够长

我正在写一个应该从实现BufRead特性的东西中读取的库; 网络数据流,标准输入等.第一个函数应该从该读取器读取数据单元并返回一个填充的结构,该结构主要填充有&'a str从线路中的帧解析的值.

这是一个最小版本:

mod mymod {
    use std::io::prelude::*;
    use std::io;

    pub fn parse_frame<'a, T>(mut reader: T)
    where
        T: BufRead,
    {
        for line in reader.by_ref().lines() {
            let line = line.expect("reading header line");
            if line.len() == 0 {
                // got empty line; done with header
                break;
            }
            // split line
            let splitted = line.splitn(2, ':');
            let line_parts: Vec<&'a str> = splitted.collect();

            println!("{} has value {}", line_parts[0], line_parts[1]);
        }
        // more reads down here, therefore the reader.by_ref() above …
Run Code Online (Sandbox Code Playgroud)

rust

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

标签 统计

rust ×10

lifetime ×2

borrow-checker ×1

borrowing ×1

return ×1

vector ×1