You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从Toml文件读取的字符串含多余引号如何去除?(toml 0.4.5)

解决Toml 0.4.5解析后字符串值多余引号的问题

这个问题的核心在于你直接使用了toml::Value类型进行格式化,而Value::StringDisplayDebug实现都会自动给字符串加上引号。当你嵌套使用format!{:?}输出时,就会出现双层引号的情况。下面是两种可靠的解决方式:

方法1:使用as_str()提取原生字符串切片

toml::Value的String变体提供了as_str()方法,可以直接获取内部的&str,这样格式化时就不会带额外引号:

use toml::Value;

fn get_config_file_content() -> String {
    "string_key = \"fdsafdsafdsfds\"".to_string()
}

fn main() {
    let cfg_file_content = get_config_file_content();
    let cfg_data: Value = toml::from_str(&cfg_file_content).expect("failed to parse toml");
    let cfg_table = cfg_data.as_table().unwrap();

    // 安全获取字符串值,避免unwrap panic
    if let Some(raw_str) = cfg_table.get("string_key").and_then(|val| val.as_str()) {
        let val = format!("value is: {}", raw_str);
        println!("{}", val); // 输出:value is: fdsafdsafdsfds
        // 如果必须用Debug格式化整个字符串,也只会有一层引号:"value is: fdsafdsafdsfds"
    } else {
        println!("Error: string_key is missing or not a string type");
    }
}

方法2:模式匹配(更安全的类型校验)

如果你想明确处理非字符串类型的情况,模式匹配是更稳妥的选择:

match cfg_table.get("string_key") {
    Some(Value::String(s)) => {
        let val = format!("value is: {}", s);
        println!("{}", val); // 输出目标结果
    }
    Some(_) => println!("Error: string_key exists but is not a string"),
    None => println!("Error: string_key is missing from config"),
}

为什么原来的代码会有多余引号?

当你直接对Value::String("fdsafdsafdsfds")使用format!("value is: {}", val1)时,ValueDisplay实现会输出带引号的字符串(即"fdsafdsafdsfds")。之后你用println!("{:?}", val)Debug格式化会给整个val字符串再套一层引号,最终就出现了"value is: "fdsafdsafdsfds""的结果。

内容的提问来源于stack exchange,提问作者user9180011

火山引擎 最新活动