gpt4 book ai didi

rust - 调用函数时,如何自动将From特质转换为通用参数类型?

转载 作者:行者123 更新时间:2023-12-03 11:44:40 26 4
gpt4 key购买 nike

在以下代码中显式使用String::from可以正常工作,但是如何使它自动使用From<OsStringWrap<'a>>特性而不显式使用String::from呢?

use serde::Serialize; // 1.0.115

struct OsStringWrap<'a>(&'a std::ffi::OsString);
impl<'a> From<OsStringWrap<'a>> for String {
fn from(s: OsStringWrap) -> String {
s.0.to_string_lossy().to_string()
}
}

pub fn insert<T: Serialize + ?Sized, S: Into<String>>(_key: S, _value: &T) {}

fn main() {
for (key, value) in std::env::vars_os() {
// HOW-TO: auto use From<OsStringWrap<'a>> trait
// without explicit `String::from` like below?
/*
insert(OsStringWrap(&key), &OsStringWrap(&value))
*/

// below using `String::from` to make it explicitly
// but want to find a way to make it shorter
insert(OsStringWrap(&key), &String::from(OsStringWrap(&value)))
}
}
Playground,而 insert方法是 tera的真实案例

最佳答案

您目前的要求是不可能的。您的insert函数接受通用类型,因此没有任何内容可以告诉编译器应将哪种类型转换为哪种类型。这个小例子是等效的:

fn demo<T>(_: T) {}

fn main() {
demo(true.into());
}
由于编译器不知道要转换为哪种具体类型,因此程序员 必须指定它。
您可能会更改函数,以接受可以转换为 String(例如 T: Into<String>)或被引用为 &str(例如 T: AsRef<str>)的任何内容。
也可以看看:
  • Type must be known in this context when using Iterator::collect
  • Why is it discouraged to accept a reference to a String (&String), Vec (&Vec), or Box (&Box) as a function argument?
  • 关于rust - 调用函数时,如何自动将From特质转换为通用参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64146201/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com