Я новичок в ie в Rust из Python. Я считаю, что это базовый c вопрос, но я слишком новичок, чтобы найти ответ по таким ключевым словам, как Type Casting Option .
In Python, чтобы средство проверки типов знало, что возврат тип не Optional[int] + int
, мы можем адресовать assert
logi c, чтобы принудительно использовать проверку типов. Знайте, что x
никогда не будет None
после строки assert
.
from typing import Optional
def add_one(x: Optional[int] = None) -> int:
if x is None:
x = 0
assert x is not None
return x + 1
if __name__ == '__main__':
add_one(0) # 1
add_one() # 1
add_one(999) # 1000
В Rust, предполагая, что интерфейс такой же, как добиться того же? А именно, как заставить компилятор знать, что тип x
больше не Option
?
fn add_one(mut x: Option<i32>) -> i32 {
if x == None {
x = Some(0);
}
return x + 1;
}
fn main() {
add_one(Some(0));
add_one(None);
add_one(Some(999));
}
Вот сообщение об ошибке:
error[E0369]: binary operation `+` cannot be applied to type `std::option::Option<i32>`
--> tmp.rs:5:14
|
5 | return x + 1;
| - ^ - {integer}
| |
| std::option::Option<i32>
|
= note: an implementation of `std::ops::Add` might be missing for `std::option::Option<i32>`
Обратите внимание, что я пробовал кое-что например, добавление другой переменной с типом i32 (let y: i32 = x;
), но это не сработало и со следующим сообщением.
error[E0308]: mismatched types
--> tmp.rs:5:22
|
5 | let y: i32 = x;
| ^ expected i32, found enum `std::option::Option`
|
= note: expected type `i32`
found type `std::option::Option<i32>`