#struct-fields #format-string #string #struct #replace #format #fmt

strung

使用不同的/自定义的前缀/后缀轻松访问字符串中的结构体字段:“Hello, {field}”

5次发布

0.1.4 2023年11月11日
0.1.3 2022年9月19日
0.1.2 2022年9月14日
0.1.1 2022年9月12日
0.1.0 2022年9月12日

#55 in 值格式化

每月33次下载
用于 2 个Crates(通过 querio

MIT/Apache

22KB
68 代码行

轻松访问字符串中的结构体字段

🐠 在 Cargo.toml 的依赖项中添加 strung

[dependencies]
strung = "0.1"

🦀 在rust中使用/导入预定义的所有内容

use strung::prelude::*;

🦊 对未命名字段有效

#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
    let s: String = Struct("Bob", 10).strung("{0} is {1}th"); 
}

🦊 对命名字段有效

#[derive(Strung)]
struct Struct {
    name: &'static str,
    pos: u32,
}
fn main(){
    let s: String = Struct{name:"Bob", pos:10}.strung("{name} is {pos}th."); 
    // fields can also be addressed by their index
    let z: String = Struct{name:"Bob", pos:10}.strung("{0} is {1}th."); 
}

忽略

🐳 使用 #[igno]#[ignore]#[strung(igno)]#[strung(ignore)] 使字段不可用
🦞 如果字段类型没有实现 Display,则必须忽略!

struct NoDisplay;
#[derive(Strung)]
struct Struct (&'static str, u32, #[igno] NoDisplay);
fn main(){
    let s: String = Struct("Bob", 10, NoDisplay)
        .strung("{0} is {1}th, he won {2}!"); 
}

级联

🐳 使用 #[cscd]#[cascade]#[strung(cscd)]#[strung(cascade)] 来实现级联(递归)。
🐑 默认情况下,忽略级联字段
🐔 使用 #[notice]#[ntce] 或在 #[strung(..)] 中使用它们以使其可用,

#[derive(Strung)]
struct Struct &'static str, u32);
#[derive(Strung)]
struct Cascade (u32, #[cscd] Struct);
fn main(){
    let s: String = Cascade(11,Struct("Bob", 10))
        .strung("{1.0} is {1.1}th for the {0}th time!"); 
    // => Bob is 10th for the 11th time!
}

前缀和后缀预制件

🐈 提供了 5 种不同的预制件

#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
    let t = Struct("Bob", 10);
    let s = t.strung_curly("{0} is {1}th."); 
    let s = t.strung_angle("<0> is <1>th."); 
    let s = t.strung_dollry("${0} is ${1}th."); 
    let s = t.strung_dollar("$0 is $1th."); 
    let s = t.strung_hashtag("#0 is #1th."); 
}

自定义前缀和后缀

🦊 您也可以以不同的方式自定义前/后缀
🦅 全局 - 使用静态变量和 .strung_static(..)

#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
    strung::set_static("<",">");
    let s: String = Struct("Bob", 10).strung_static("<0> is <1>th."); 
}

🐎 每个结构体 - 这将覆盖默认的 .strung(..) 前后缀

#[derive(Strung)]
#[strung("<",">")]
struct Struct (&'static str, u32);
fn main(){
    let s: String = Struct("Bob", 10).strung("<0> is <1>th."); 
}

🐍 每次调用 - 使用参数 .strung_dynamic(pre,post,..)

#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
    let s: String = Struct("Bob", 10).strung_dynamic("<",">","<0> is <1>th."); 
}

🦎 每次调用 - 使用泛型常量字符 .strung_generic::<pre,post>(..)

#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
    let s: String = Struct("Bob", 10).strung_generic::<'<','>'>("<0> is <1>th."); 
}

性能比较

🐕 动态/泛型/全局具有相同的运行时速度
🐇 默认/预制件/每个结构体更快!
🐁 使用 ~650 个字符和 6 个字段占位符的字符串

更多信息

🦕 文档
🦎 变更日志
🐱 GitHub
👾 Discord 服务器


许可

许可方式为 Apache License, Version 2.0MIT 许可,由您选择。
除非您明确表示,否则您提交给此存储库的任何贡献(根据 Apache-2.0 许可定义),均应以上述双许可方式提供,不附加任何额外条款或条件。

依赖项

~255–700KB
~17K SLoC