将字符串值赋给结构体的字符串字段,而不显式转换rust中的字符串值(&str)

bvhaajcl  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(125)

我希望能够编写这样的代码:

ExampleStruct {
    field1: "value1",
    field2: "value2",
    nested: ExampleNestedStruct{ 
        field3: "value3",
    },
}

如下所示的结构:
第一个
但由于ExampleStruct必须具有String类型的字段而不是&str类型的字段,因此我必须使用.to_owned()或类似函数显式转换每个值,这是可行的,但不是最优的。
我考虑过创建一个具有&str字段的相同结构体和一个利用序列化的转换方法,但对于这样一个简单的问题来说,这似乎过于复杂了,而且在我的代码中有两个本质上相同的结构体。
有没有什么方法可以把所有出现的&str隐式地转换成String?或者有没有什么语法我可能不知道?我是个新手。
我试着查找创建字符串的可能语法,这些字符串似乎都包括某种显式函数调用。
我还发现了一些函数参数的自动转换语法(如果可以这么称呼的话),如下所示:fn fn名称〈T:转换为(s:T),但这是行不通的,因为我调用的不是带参数的函数。
编辑:我想我可以通过写一个宏来实现这一点。我会在有时间的时候尝试一下,除非有人已经创建了一个&str_to_String宏?

ie3xauqp

ie3xauqp1#

你应该能够使用core::convert::Into trait。这是你可能会问的代码:

struct ExampleStruct {
    field1: String,
    field2: String,
    nested: ExampleNestedStruct,
}

struct ExampleNestedStruct {
  field3: String,
}

let e = ExampleStruct{
  field1: "123".into(),
  field2: "123".into(),
  nested: ExampleNestedStruct { 
    field3:"123".into() 
  },
};

有关特征的更多详细信息:https://doc.rust-lang.org/beta/core/convert/trait.Into.html

gopyfrb3

gopyfrb32#

好的,我通过创建一个宏来解决这个问题。你可以在这里找到它https://crates.io/crates/append_to_string
可能看起来恐吓一些,但它并不是太复杂,一旦你熟悉了syn板条箱。
现在,宏允许我编写如下代码:

// nested struct example
let b1 = append_to_string!( 
    B {
        s1: "hello",
        s2: "world",
        a: A {
            s1: "nested",
            s2: "struct",
        }
    }
);

而不是这样:

let b2 = B {
    s1: "hello".to_string(),
    s2: "world".to_string(),
    a: A {
        s1: "nested".to_string(),
        s2: "struct".to_string(),
    }
};

相关问题