假设我们有以下枚举:
#[derive(Serialize)]
#[serde(untagged)]
pub enum CustomType {
Foo(Foo),
Bar(Bar),
}
为了使函数对于不同的参数类型具有相同的行为
fn my_function(my_param: &CustomType){
// logic to use "my_param"
// my_param is used for the handlebars crate, therefore requires to be Serde Serializable
let source = // ...
handlebars.render_template(&source, my_param).unwrap();
}
我们想在程序的不同部分中调用此类函数,如下所示:
fn function_a(bar: &Bar){
my_function(CustomType::Bar(bar.clone()));
}
fn function_b(foo: &Foo){
my_function(CustomType::Foo(foo.clone()));
}
该代码有效,但是我真的不喜欢它,因为我必须这样做.clone()
。我已经尝试过仅传递引用,但不适用于枚举。
这是正确的防锈方法吗?
CustomType
如果您不想调用,可以使用take引用而不是拥有的值clone
:
use serde::{Serialize};
#[derive(Serialize)]
struct Foo(String);
#[derive(Serialize)]
struct Bar(String);
#[derive(Serialize)]
#[serde(untagged)]
enum CustomType<'a> {
Foo(&'a Foo),
Bar(&'a Bar),
}
fn my_function(my_param: &CustomType) {
println!("serialized {}", serde_json::to_string(&my_param).unwrap());
}
fn func_foo(foo: &Foo) {
my_function(&CustomType::Foo(foo));
}
fn func_bar(bar: &Bar) {
my_function(&CustomType::Bar(bar));
}
fn main() {
let foo = Foo("Foo".to_string());
let bar = Bar("Bar".to_string());
func_foo(&foo);
func_bar(&bar);
}
但是,如果CustomType
存在的唯一原因是您可以将Serializable
类型传递给my_function
它,那么将其设为my_function
通用并接受任何Serializable
引用可能会更简单:
use serde::{Serialize};
#[derive(Serialize)]
struct Foo(String);
#[derive(Serialize)]
struct Bar(String);
fn my_function<T: Serialize>(my_param: &T) {
println!("serialized {}", serde_json::to_string(my_param).unwrap());
}
fn main() {
let foo = Foo("Foo".to_string());
let bar = Bar("Bar".to_string());
my_function(&foo);
my_function(&bar);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句