LINUX.ORG.RU

История изменений

Исправление www_linux_org_ru, (текущая версия) :

Но как? Чтобы вернуть что-то из функции, нужно это что-то создать в функции, а вывод типов потребует точно указать тип этого объекта.

если с боксом, то вот так https://play.rust-lang.org/?gist=50e696cc5e8b3dcdddeac22637a9666b&version...

extern crate rand;
use rand::Rng;
use std::fmt::Debug;

#[inline(never)]
fn my_u32() -> impl Debug + Copy {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<u32>();
    return r;
}

fn my_f64() -> impl Debug + Copy  {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<f64>();
    return r;
}

fn my_val() -> Box<Debug> {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<u8>();
    println!("random={}", r);
    if r > 127 {
        println!("return i32");
        return Box::new(my_u32());
    }
    else{
        println!("return f64");
        return Box::new(my_f64());
    }
}


fn main() {
    let vs: Vec<Box<Debug>> = vec![Box::new(my_u32()), Box::new(my_f64()), my_val()];
    for v in &vs {
        println!("{:?}", v);
    }
}

пример выхлопа (он рандомный если что)

random=233
return i32
3098332417
0.3006261433519364
569887438

т.е. если я правильно понимаю, то my_val возвращает тип, у которого известен только трейт Debug, а реальный тип неизвестен компилятору

Исходная версия www_linux_org_ru, :

Но как? Чтобы вернуть что-то из функции, нужно это что-то создать в функции, а вывод типов потребует точно указать тип этого объекта.

если с боксом, то вот так https://play.rust-lang.org/?gist=50e696cc5e8b3dcdddeac22637a9666b&version...

extern crate rand;
use rand::Rng;
use std::fmt::Debug;

#[inline(never)]
fn my_u32() -> impl Debug + Copy {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<u32>();
    return r;
}

fn my_f64() -> impl Debug + Copy  {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<f64>();
    return r;
}

fn my_val() -> Box<Debug> {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<u8>();
    println!("random={}", r);
    if r > 127 {
        println!("return i32");
        return Box::new(my_u32());
    }
    else{
        println!("return f64");
        return Box::new(my_f64());
    }
}


fn main() {
    let vs: Vec<Box<Debug>> = vec![Box::new(my_u32()), Box::new(my_f64()), my_val()];
    for v in &vs {
        println!("{:?}", v);
    }
}

пример выхлопа

random=233
return i32
3098332417
0.3006261433519364
569887438

т.е. если я правильно понимаю, то my_val возвращает тип, у которого известен только трейт Debug, а реальный тип неизвестен компилятору