2016-12-22 56 views
2

在尝试实现具有泛型参数的特征并访问这些泛型参数的字段时,我遇到了一条错误消息,说明所讨论的参数不包含这些字段。无法访问动态特征实现中的结构字段

下面是显示该问题的一些示例代码:

pub struct Settings { 
    pub time: String, 
} 

pub trait Foo { 
    fn get<T>(t: T); 
} 

struct Bar; 

impl Foo for Bar { 
    fn get<Settings>(t: Settings) { 
     let x = t.time; 
    } 
} 

Playground

由编译器给定的错误信息是如下:

error: no field `time` on type `Settings` 

这没有什么意义在上下文。我认为这可能是我的一些滥用通用特征的错误信息,但这个问题使得这个问题成为现实。

回答

4

在方法实现的上下文中,Settings是“通用类型”。

也就是说,你已经在你的榜样了那里,就是这相当于:

impl Foo for Bar { 
    fn get<RandomWordHere>(t: RandomWordHere) { 
     let x = t.time; 
    } 
} 

是否错误更有意义呢?您的通用类型Settings遮蔽了您的实际类型Settings

现在无论如何,你的方法在这个意义上不是非常通用的..既然你说“我想要一个Settings结构的实际实例”。而您可能想要“我想要一个具有time字段的任何类型的实例”。

这里是你怎么做后者:

pub trait HasTime { 
    fn get_time(&self) -> &String; 
} 

pub struct Settings { 
    pub time: String 
} 

impl HasTime for Settings { 
    fn get_time(&self) -> &String { 
     &self.time 
    } 
} 

pub struct OtherStruct; 

pub trait Foo { 
    fn get<T>(t: T) where T: HasTime; 
} 

struct Bar; 

impl Foo for Bar { 
    fn get<T>(t: T) where T: HasTime { 
     let x = t.get_time(); 
    } 
} 

fn main() { 
    Bar::get(Settings{time: "".into()}); // This is fine 
    // Bar::get(OtherStruct{}); // This is an error.. it doesn't implement HasTime 
} 

Playground link