我正在尝试对生成随机表达式的二叉树进行编码。我需要随机数和一组函数。我收到一个向量,其中包含树中表达式的功能和深度。在运算符向量中,我还包括一个“ 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 的新手,我在使用借用检查器时遇到了一些麻烦。我不明白为什么这段代码不能编译。抱歉,如果这与之前回答的问题很接近,但我似乎无法在我看过的其他问题中找到解决方案。
我理解将本地字符串作为切片(&str)返回的相似性,但在这种情况下,它只是返回一个字符串,不足以让我对我试图返回向量的代码进行推理。据我所知,我试图返回对str将在功能块末尾超出范围的类型的引用,所以我应该将该向量映射&str为向量String吗?我不太关心转换&str为String. 首先,我只想让它工作。
这是代码,错误在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) 如何在一个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) 我想只用分隔符将字符串拆分一次并将其放入元组中.我试过了
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进入功能块之外的现有?或者是否有更好的方法只分裂一次字符串?
为什么会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) 此代码引发关于从函数返回引用的错误:
fn sha512_256_digest(str: &[u8]) -> &[u8] {
let x = digest::digest(&digest::SHA512_256, str);
x.as_ref()
}
Run Code Online (Sandbox Code Playgroud)
在这里返回x的as_ref()值的正确方法是什么?
我有以下功能:
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生命周期,此代码正在生成.有没有人知道是否有一些解决方法可以实现这一目标?
我正在尝试编写一个简单的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) 我正在尝试制作环境变量的只读映射。
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 似乎非常适合只读结果。
随意建议一个更惯用的方法来做到这一点。
我正在写一个应该从实现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)