Rust-具有多种类型的最佳实践的调用函数

莱科斯94

假设我们有以下枚举:

#[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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章