gpt4 book ai didi

rust - 无法从另一个用本地类型参数化的 crate 实现通用类型的另一个 crate 的特征

转载 作者:行者123 更新时间:2023-11-29 07:50:01 26 4
gpt4 key购买 nike

此测试代码(playpen):

use std::fmt::{Display, Formatter, Error};

struct MyLocalType;

type MyResult = Result<MyLocalType, String>;

impl Display for MyResult {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
f.write_str("some test string")
}
}

fn main() {
let r: MyResult = Ok(MyLocalType);
println!("{}" , r);
}

产生这个错误信息:

<anon>:7:1: 11:2 error: the impl does not reference any types defined in this crate; only traits defined in the current crate can be implemented for arbitrary types [E0117]
<anon>:7 impl Display for MyResult {
<anon>:8 fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
<anon>:9 f.write_str("some test string")
<anon>:10 }
<anon>:11 }

此代码在 Rust 的 1 月版本中成功编译;我现在该如何实现?

最佳答案

对于像 type 这样的纯别名,没有直接的方法来解决这个问题。 .

代码同上

impl Display for Result<MyLocalType, String>

并且编译器无法确保在其他 crate 中不会有冲突的实现(也就是无法确保实现是“一致的”)。能做到有时候肯定是有用的,可惜之前是编译器接受的bug。

解决方案包括:

  • Result 定义合适的包装器类型,例如struct MyResult(Result<MyLocalType, String>); ,
  • 定义您自己的枚举:enum MyResult { Ok(MyType), Err(String) } ,
  • 定义一个包装器类型,但只在打印时使用它,即写println!("{}", Wrapper(r));而不是 println!("{}", r); .

这两个都是MyResult本地类型,所以 impl那么应该是合法的。

关于rust - 无法从另一个用本地类型参数化的 crate 实现通用类型的另一个 crate 的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29789877/

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