2017-07-06 67 views
4

我想使用两种不同类型的对象write_fmt方法:使用Write我如何消除Rust中的特征?

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")); 
} 

我得到一个错误,因为它们都命名为相同的:

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;` 

回答

8

可以直接调用性状方法:

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")); 
} 

您也可以选择只导入特征在一个较小的范围:

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")); 
    } 
} 

请注意,如果您选择使用一个较小的范围内,也可以直接使用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返回值。

参见:

+0

这工作,谢谢,你! – ashleysmithgpu

5

可以为use指定别名:

use std::fmt::Write as FmtWrite; 
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")); 
} 

要小心,当不同类型实施不同的特质此解决方案有效同名。如果同一类型,具有相同的名称实现不同的特质,你必须使用Shepmaster's answer

mod foo { 
    pub trait Trait { 
     fn do_something(&self) {} 
    } 
} 

mod bar { 
    pub trait Trait { 
     fn do_something(&self) {} 
    } 
} 

pub struct Concrete {} 
impl foo::Trait for Concrete {} 
impl bar::Trait for Concrete {} 

fn main() { 
    let x = Concrete {}; 

    { 
     use foo::Trait; // use limited to scope 

     x.do_something(); // call foo::Trait::do_something 
    } 
    {  
     foo::Trait::do_something(&x); // complete path to disambiguate 
     bar::Trait::do_something(&x); // complete path to disambiguate 
    } 
    { 
     use foo::Trait as FooTrait; 
     use bar::Trait; 

     x.do_something(&x); // ERROR: multiple applicable items in scope 
    } 
} 
相关问题