有几个问题似乎与我遇到的问题有关.例如,请看这里和这里.基本上我正在尝试String在本地函数中构建一个函数,但是然后将其作为一个函数返回&str.切片不起作用,因为寿命太短.我无法str直接在函数中使用,因为我需要动态构建它.但是,我也不想返回a,String因为一旦它构建完成,它进入的对象的性质就是静态的.有没有办法让我的蛋糕也吃?
这是一个最小的非编译复制:
fn return_str<'a>() -> &'a str {
let mut string = "".to_string();
for i in 0..10 {
string.push_str("ACTG");
}
&string[..]
}
Run Code Online (Sandbox Code Playgroud) 我想编写一个程序,分两步编写一个文件.在程序运行之前,该文件可能不存在.文件名是固定的.
问题是OpenOptions.new().write()可能会失败.在这种情况下,我想调用自定义函数trycreate().我们的想法是创建文件而不是打开它并返回一个句柄.由于文件名是固定的,trycreate()没有参数,我不能设置返回值的生命周期.
我该如何解决这个问题?
use std::io::Write;
use std::fs::OpenOptions;
use std::path::Path;
fn trycreate() -> &OpenOptions {
let f = OpenOptions::new().write(true).open("foo.txt");
let mut f = match f {
Ok(file) => file,
Err(_) => panic!("ERR"),
};
f
}
fn main() {
{
let f = OpenOptions::new().write(true).open(b"foo.txt");
let mut f = match f {
Ok(file) => file,
Err(_) => trycreate("foo.txt"),
};
let buf = b"test1\n";
let _ret = f.write(buf).unwrap();
}
println!("50%");
{
let f = OpenOptions::new().append(true).open("foo.txt");
let mut f …Run Code Online (Sandbox Code Playgroud) 我在试图理解为什么我不能返回一个&str由String(良好,什么时候as_str准备好?)而产生的价值时遇到了一些麻烦?我做错了什么.我得到了这个想法,因为我所做的一切都没有让这个价值足够长久使用.
我正在尝试实现error::Error自定义结构:
impl error::Error for LexicalError {
fn description(&self) -> &str {
let s = format!("{}", self);
// s doesn't live long enough to do this, I've tried
// cloning s and using that, but still the clone doesn't
// live long enough.
s.trim()
}
fn cause(&self) -> Option<&error::Error> {
None
}
}
Run Code Online (Sandbox Code Playgroud)
(对于完整的片段,这里是围栏)
我无法弄清楚如何返回&str description,我想重用Display逻辑,除非我完全误解了description应该返回的内容(也许是对问题的简短描述).要么,我得到同样的问题,返回的format!(...)是一个变量,我似乎无法活得足够长,对我有用.
我正在尝试对生成随机表达式的二叉树进行编码。我需要随机数和一组函数。我收到一个向量,其中包含树中表达式的功能和深度。在运算符向量中,我还包括一个“ 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)