【发布时间】:2019-07-12 11:21:13
【问题描述】:
我正在尝试编写生成随机表达式的二叉树。我需要随机数和一组函数。我收到一个向量,其中包含树中表达式的函数和深度。在操作符向量中,我还包含一个“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 {
val: value,
left: Create_Expression(operators.clone(), p - 1),
right: Create_Expression(operators.clone(), p - 1),
};
return Some(Box::new(new_node));
}
错误:
error[E0515]: cannot return value referencing local variable `value`
--> src/lib.rs:22:16
|
15 | let value2: &str = value.as_ref();
| ----- `value` is borrowed here
...
22 | return Some(Box::new(new_node));
| ^^^^^^^^^^^^^^^^^^^^^^^^ returns a value referencing data owned by the current function
【问题讨论】:
-
随机生成的值需要超过函数体。可能是在表达式中存储拥有的字符串而不是切片?
-
Idiomatic Rust 使用
snake_case表示变量、方法、宏和字段;UpperCamelCase用于类型和枚举变体;SCREAMING_SNAKE_CASE用于静态和常量。请改用ExpressionNode和create_expression。 -
没有理由使用
std::option::Option或std::boxed::Box— 这些都在前奏中,不需要完全限定(实际上你并没有在任何地方限定它们)。在块的末尾使用显式的return也是不习惯的。
标签: rust