我在Rust编程只有几个月.话虽如此,我还是收到了这样的警告:

warning: value assigned to `amount` is never read
   --> src\execute_action_functions.rs:428:21
    |
428 |             let mut amount: Option<f64> = None;
    |                     ^^^^^^
    |
    = help: maybe it is overwritten before being read?

为清楚起见,为避免意外遗漏关键细节,整个函数如下:

pub async fn handle_all_gemini(prefix: &str, message: &str, shared_neural_network: Arc<Mutex<NeuralNetwork>>, divisor: &f64) {


    if prefix.contains("Gemini received") {
        if message.contains("heartbeat") {
            return;
        }
        else {
            let data: Result<Value, serde_json::Error> = serde_json::from_str(message);

            let mut amount: Option<f64> = None;
            let mut price: Option<f64> = None;

            match data {
                Ok(value) => {
                    if value.get("socket_sequence")
                    .and_then(Value::as_i64) == Some(0) {
                        println!("Gemini: socket sequence is 0, ignoring...");
                        return;
                    }
                    if let Value::Object(map) = &value {
                        if let Some(Value::Array(events)) = map
                        .get("events") {
                            if let Some(Value::Object(event)) =
                             events.get(0) {
                                amount = event.get("amount")
                                    .and_then(|v| v.as_str())
                                    .and_then(|s| s.parse::<f64>().ok());
                                price = event.get("price")
                                    .and_then(|v| v.as_str())
                                    .and_then(|s| s.parse::<f64>().ok());
                            } 
                            else {
                                panic!("Gemini: event is not an object.
                                message: {}", message);
                            }
                        } 
                        else {
                            panic!("Gemini: events is not an array.
                            message: {}", message);
                        }
                    } 
                    else {
                        panic!("Gemini: Value is not an object.
                        message: {}", message);
                    }
                },
                Err(e) => {
                    panic!("Failed to parse JSON Gemini message\nError: {}
                    Message: {}", e, message);
                },
            }

            let new_values = [amount, price];
            let mut scaled_values: Vec<f64> = Vec::new();
            for value in &new_values {
                if let Some(val) = value {
                    scaled_values.push(val / divisor);
                } 
                else {
                    println!("One of the values was None");
                    panic!("amount: {:?}, price: {:?}", &amount, &price);
                }
            }
            if prefix.contains("sol") {
                let indices = [58, 59];
                let mut neural_network = 
                    shared_neural_network.lock().await;
                neural_network.update_input(&indices, &scaled_values)
                .await;
            }
            else if prefix.contains("xrp") {
                let indices = [92, 93];
                let mut neural_network = 
                    shared_neural_network.lock().await;
                neural_network.update_input(&indices, &scaled_values)
            .await;
            }
            else {
                panic!("This shouid never occur. Somehow prefix cointained phrase
                Gemini received but didn't contain the phrases XLM or XRP.
                prefix is: {}\nmessage: {}", prefix, message);
            }
        }
    }
    else {
        println!("Gemini: got a weird message: {}\nprefix:{}", message, prefix);
    }
}

正如您所看到的,至少在初始化new_values时,它肯定正在被读取,如果我没有弄错的话,在for循环中也是如此.

我试着将其更改为amount: Option<f64>;,但收到了一个非常奇怪的警告:

warning: variable does not need to be mutable
   --> src\execute_action_functions.rs:429:17
    |
429 |             let mut price: Option<f64>;
    |                 ----^^^^^
    |                 |
    |                 help: remove this `mut`

这没有任何意义,因为我要将值更改为if let Value::Object(map) = &value { 因此,这让它变得更加令人困惑.我不确定我做错了什么,因为我没有给它一个真正的价值,所以没有"在读之前被覆盖"的问题,对吗?这跟if let号公路有关系吗? 任何帮助都将不胜感激.

推荐答案

您首先在声明它的行中将amount赋给None:

let mut amount: Option<f64> = None;

你稍后在这里reassign amount:

amount = event.get("amount")
    .and_then(|v| v.as_str())
    .and_then(|s| s.parse::<f64>().ok());

在这里阅读amount篇:

let new_values = [amount, price];

编译器实际上在这里非常聪明:达到第二个赋值的代码的所有分支都会产生panic,导致它们永远不会 到达下一读数.因此,编译器说对None的初始赋值是不必要的,因为该值永远不会被读取. 您可以通过将该行更改为以下内容来修复此警告:

let amount: Option<f64>; //no initial value here

因为amount只被分配给一次(在它被读取之前),所以它不必被声明为可变的.


值得注意的是,这只是一个warning,而不是一个error.您的程序仍将编译并正常工作,编译器只是告诉您它包含可能是无意的不必要的逻辑.

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

将此字符串转换为由空格字符分隔的空格

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

如果成员都实现特征,是否在多态集合上实现部分重叠的特征?

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

为昂贵的for循环制作筛子

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

Trait bound i8:来自u8的不满意

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

Rust中WPARAM和VIRTUAL_KEY的比较

获取已知数量的输入

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

具有多个键的 HashMap

在1.5n次比较中找到整数向量中的最大和次大整数

使用 lalrpop 在 rust 中解析由 " 引用的字符串

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

预期的整数,找到 `&{integer}`

通用函数中的生命周期扣除和borrow (通用测试需要)

提取 struct 生成宏中字段出现的索引