我想在两种不同类型的对象上使用write_fmt方法:

use std::fmt::Write;
use std::io::Write;

fn main() {
    let mut a = String::new();
    let mut b = std::fs::File::create("test").unwrap();

    a.write_fmt(format_args!("hello"));
    b.write_fmt(format_args!("hello"));
}

我在使用Write时出错,因为它们的名称相同:

error[E0252]: a trait named `Write` has already been imported in this module
 --> src/main.rs:8:5
  |
7 | use std::fmt::Write;
  |     --------------- previous import of `Write` here
8 | use std::io::Write;
  |     ^^^^^^^^^^^^^^ `Write` already imported
      a.write_fmt(format_args!("hello"));
      b.write_fmt(format_args!("hello"));

或者我得到一个错误,说这个特征不可用:

error[E0599]: no method named `write_fmt` found for type `std::fs::File` in the current scope
  --> src/main.rs:76:4
   |
76 |    b.write_fmt(format_args!("hello"));
   |      ^^^^^^^^^
   |
   = help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
   = help: candidate #1: `use std::io::Write;`

推荐答案

您可以直接调用trait方法:

fn main() {
    let mut a = String::new();
    let mut b = std::fs::File::create("test").unwrap();

    std::fmt::Write::write_fmt(&mut a, format_args!("hello"));
    std::io::Write::write_fmt(&mut b, format_args!("hello"));
}

您还可以 Select 仅在较小范围内导入特征:

fn main() {
    let mut a = String::new();
    let mut b = std::fs::File::create("test").unwrap();

    {
        use std::fmt::Write;
        a.write_fmt(format_args!("hello"));
    }

    {
        use std::io::Write;
        b.write_fmt(format_args!("hello"));
    }
}

请注意,如果 Select 使用较小的范围,也可以直接使用write!宏:

fn main() {
    let mut a = String::new();
    let mut b = std::fs::File::create("test").unwrap();

    {
        use std::fmt::Write;
        write!(a, "hello");
    }

    {
        use std::io::Write;
        write!(b, "hello");
    }
}

无论哪种情况,都应该处理Result返回值.

另见:

Rust相关问答推荐

通过使用光标拖动角来绕其中心旋转矩形

制作一片连续整数的惯用Rust 方法?

用 rust 蚀中的future 展望 struct 的future

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

Trait bound i8:来自u8的不满意

`RwLockWriteGuard_,T`不实现T实现的特征

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

为相同特征的特征对象使用 move 方法实现特征

为什么实现特征的对象期望比具体对象有更长的生命周期?

Rust ECDH 不会产生与 NodeJS/Javascript 和 C 实现相同的共享密钥

Option<&T> 如何实现复制

使用 lalrpop 在 rust 中解析由 " 引用的字符串

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

&self 参数在 trait 的功能中是必需的吗?

内部值发生变化时 Rc 的行为

你能告诉我如何在 Rust 中使用定时器吗?

Rust,我如何正确释放堆分配的内存?

如何将 u8 切片复制到 u32 切片中?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?