面试题答案
一键面试trait TraitA {
fn do_something(&self);
}
struct StructA;
impl TraitA for StructA {
fn do_something(&self) {
println!("StructA does something");
}
}
struct StructB;
impl TraitA for StructB {
fn do_something(&self) {
println!("StructB does something");
}
}
enum DynamicValue {
Int(i32),
Float(f64),
Str(String),
Custom(Box<dyn TraitA>),
}
fn handle_dynamic_value(value: DynamicValue) {
match value {
DynamicValue::Int(i) => println!("Handling Int: {}", i),
DynamicValue::Float(f) => println!("Handling Float: {}", f),
DynamicValue::Str(s) => println!("Handling Str: {}", s),
DynamicValue::Custom(custom) => {
if let Some(struct_a) = custom.downcast_ref::<StructA>() {
struct_a.do_something();
} else if let Some(struct_b) = custom.downcast_ref::<StructB>() {
struct_b.do_something();
} else {
println!("Unknown type implementing TraitA");
}
}
}
}
你可以使用如下方式调用这个函数:
fn main() {
let int_value = DynamicValue::Int(10);
let float_value = DynamicValue::Float(3.14);
let str_value = DynamicValue::Str("Hello".to_string());
let struct_a_value = DynamicValue::Custom(Box::new(StructA));
let struct_b_value = DynamicValue::Custom(Box::new(StructB));
handle_dynamic_value(int_value);
handle_dynamic_value(float_value);
handle_dynamic_value(str_value);
handle_dynamic_value(struct_a_value);
handle_dynamic_value(struct_b_value);
}