История изменений
Исправление 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, а реальный тип неизвестен компилятору