Здравствуйте, cl-user, Вы писали:
CU>Вот такую конструкцию: FromPrimitive::from_int(x).unwrap();
легче никак не сделать? Я по наивности подумал, что реализация FromPrimitive позволит писать 'x as int'
Твое ожидание не совсем оправданно и вот почему. Для примера можно взять такой код:
use std::num::FromPrimitive;
use std::int;
#[deriving(FromPrimitive)] // (1)
enum MyType {
Val1 = 0,
Val2 = 1,
Val3 = 10
}
fn main() {
let val1: Option<MyType> = FromPrimitive::from_int(1); // (2)
let val2: Option<MyType> = FromPrimitive::from_int(2); // (3)
println!("{:?}, {:?}", val1, val2);
}
Данное приведение типов создавалось с оглядкой на стандартные перечисления из языка Си. При этом, значения входящие в перечисление в Си, как впрочем и в Rust, не должны идти последовательно, одно за другим. Поэтому, объявляем перечисление TestData приводимым при помощи FromPrimitive (1) и делаем две конверсии, одну для существующего в перечислении значения 1 (2), а вторую для не существующего значения 2 (3). В консоли у нас окажется, как и ожидалось:
Some(Val2), None
А теперь к твоему примеру с "x as MyType". В твоем примере предполагается, что все конверсии должны проходить успешно. Но что делать, если конверсия не удалась и нам вернулся None из примера выше (3)? Попытка "добыть" значение из None приведет к следующим последствиям:
val2.unwrap();
task '<main>' failed at 'called `Option::unwrap()` on a `None` value'
В то время как гарантировать преобразование от числового значения к нашему типу мы не можем.