Re[5]: Развитие Rust
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 24.01.14 07:47
Оценка:
Здравствуйте, 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'


В то время как гарантировать преобразование от числового значения к нашему типу мы не можем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.