Как можно задать тип переменной в зависимости от определенного условия?

Почему возникает ошибка "if and else have incompatible types" в следующем коде, где я использую условие `if` и `else` в Rust? 

```rust
let user = if json["met"] == "tb_info" {
      Res {
         met: json["met"].to_string(), 
         a: json["0"].to_string(), 
         b: json["1"].to_string(), 
         c: json["2"].to_string()
      }
   } else if json["met"] == "query" {
      User {
         met: json["met"].to_string(), 
         id: json["id"].as_u64().expect("REASON"), 
         username: json["username"].to_string(), 
         tm: json["tm"].as_f64().expect("REASON"), 
         n: json["n"].as_u64().expect("REASON")
      }   
   } else {
      ErrServ {
         met: "error_create_user".to_string()
      }
   };
```
  • 17 декабря 2024 г. 19:23
Ответы на вопрос 2
Ошибка "if and else have incompatible types" в вашем коде на Rust возникает из-за того, что в ветках `if`, `else if`, и `else` возвращаются значения разных типов. Компилятор Rust требует, чтобы все ветки условного выражения `if` возвращали одно и то же значение типа. В вашем случае, `Res`, `User` и `ErrServ` — это разные типы структур, что и приводит к указанной ошибке.

Чтобы исправить эту ошибку, можно использовать один общий тип, под которым могут быть описаны все возвращаемые значения. Например, если все типы могут быть приведены к одному трейту, вы можете использовать перечисление (enum). Вот пример, как это можно сделать:

```rust
// Определяем общий тип
enum UserResponse {
    Res(Res),
    User(User),
    ErrServ(ErrServ),
}

let user: UserResponse = if json["met"] == "tb_info" {
    UserResponse::Res(Res {
        met: json["met"].to_string(), 
        a: json["0"].to_string(), 
        b: json["1"].to_string(), 
        c: json["2"].to_string(),
    })
} else if json["met"] == "query" {
    UserResponse::User(User {
        met: json["met"].to_string(), 
        id: json["id"].as_u64().expect("REASON"), 
        username: json["username"].to_string(), 
        tm: json["tm"].as_f64().expect("REASON"), 
        n: json["n"].as_u64().expect("REASON"),
    })
} else {
    UserResponse::ErrServ(ErrServ {
        met: "error_create_user".to_string(),
    })
};
```

В этом коде мы определяем `enum UserResponse`, который может содержать один из трех вариантов. Затем мы используем этот `enum` в качестве типа переменной `user`, что позволяет избежать ошибки разницы типов.
if else должен возвращать один тип. <br/> - Ты не можешь указать динамический тип переменной user. <br/> <br/> Оборачивай свои структуры в перечисление: <br/> <pre><code class="rust">enum UserRes {
Res(Res),
User(User),
ErrServ(ErrServ)
}

let user = if a == b { UserRes::Res(Res { / * ... */ }); } else { UserRes::User(User { /* ... */ }); };</code></pre>
Похожие вопросы