rust 生成拥有字符串的简写方法

omtl5h9j  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(148)

给定以下结构(实际上,它比这个结构大):

#[derive(Deserialize, Debug)]
struct Parameter {
    name: String,
    value: String,
}

如果我想创建一个示例(用于测试等):

Parameter {
    name: "name".to_string(),
    value: "value".to_string()
}

我必须在所有值的末尾调用to_string,这有点烦人,有没有创建一个拥有的字符串的捷径?

o7jaxewo

o7jaxewo1#

你可以用一个宏来缩短它:

macro_rules! s {
    ($s:expr) => { $s.to_string() }
}

#[derive(Debug)]
struct Parameter {
    name: String,
    value: String,
}

fn main() {
    println!("{:?}", Parameter { name: s!("foo"), value: s!("bar"), });
}

Playground

bt1cpqcv

bt1cpqcv2#

Jmb的宏运行良好,但我更喜欢尽可能使用普通函数。(我也更喜欢后缀操作而不是前缀+后缀操作)
这就是我使用的变体:

pub trait ToStringExt : ToString {
    /// Simply an alias for `.to_string()`.
    fn s(&self) -> String {
        self.to_string()
    }
}
impl<T> ToStringExt for T where T: ToString {}

然后使用它:

use to_string_ext::ToStringExt;

fn main() {
    let my_str: String = "some string".s();
}

如果您需要这种简化的唯一情况是将&str转换为String,那么这是一种范围更窄的替代方法:(我现在更喜欢这个)

pub trait ToOwnedExt where Self : ToOwned {
    /// Simply an alias for `.to_owned()`.
    fn o(&self) -> <Self as ToOwned>::Owned {
        self.to_owned()
    }
}
impl<T: ?Sized> ToOwnedExt for T where T: ToOwned {}

然后使用它:

use to_owned_ext::ToOwnedExt;

fn main() {
    let my_str: String = "some string".o();
}

相关问题