【问题标题】:Why is the trait bound Trait<&String> not satisfied even though I've implemented Trait<&str>?为什么即使我已经实现了 Trait<&str>,特征绑定的 Trait<&String> 也不满足?
【发布时间】:2016-08-11 18:10:39
【问题描述】:

我写了以下代码:

pub struct Serializer;

pub trait Serialize<T> {
    fn to_bert(&self, data: T) -> Vec<u8>;
}

pub trait Convert<T> {
    fn to_binary(&self, data: T) -> Vec<u8>;
}

impl<'a> Convert<&'a str> for Serializer {
    fn to_binary(&self, data: &'a str) -> Vec<u8> {
        let binary_string = data.as_bytes();
        let binary_length = binary_string.len() as i16;
        let mut binary = vec![];
        binary.write_i16::<BigEndian>(binary_length).unwrap();
        binary.extend(binary_string.iter().clone());
        binary
    }
}

impl Serialize<String> for Serializer {
    fn to_bert(&self, data: String) -> Vec<u8> {
        let binary_string = self.to_binary(&data);
        self.generate_term(BertTag::String, binary_string)
    }
}

impl<'a> Serialize<&'a str> for Serializer {
    fn to_bert(&self, data: &'a str) -> Vec<u8> {
        let binary_string = self.to_binary(data);
        self.generate_term(BertTag::String, binary_string)
    }
}

编译时,我收到一个错误,提示编译器找不到正确的调用函数:

error: the trait bound `serializers::Serializer: serializers::Convert<&std::string::String>` is not satisfied [E0277]
let binary_string = self.to_binary(&data);
                         ^~~~~~~~~
help: run `rustc --explain E0277` to see a detailed explanation
help: the following implementations were found:
help:   <serializers::Serializer as serializers::Convert<&'a str>>
help:   <serializers::Serializer as serializers::Convert<types::BertType>>

为什么当我指定&amp;str 的生命周期时,编译器找不到正确的实现?我该如何解决这个问题?

【问题讨论】:

  • 为什么你认为Serializer应该实现Convert&lt;&amp;String&gt;?我看到的是Convert&lt;&amp;'a str&gt;,而不是&amp;String
  • @Shepmaster 当我将&amp;data 作为参数传递给to_binary 函数时,我希望&amp;String 将转换为&amp;str

标签: rust lifetime


【解决方案1】:

我该如何解决这个问题?

通过从data 获取&amp;str

let binary_string = self.to_binary(&*data);

就像错误所说的那样,Convert&lt;&amp;String&gt; 没有为Serializer 实现,但Convert&lt;&amp;str&gt; 是。 &amp;data 是一个&amp;String,但你需要一个&amp;str,写&amp;*data 会产生一个&amp;str


请注意,通常(当字符串未更改时)不必为String&amp;str 实现相同的功能,只需&amp;str 版本就足够了。在您的示例中,您可以删除 SerializerSerialize&lt;String&gt; 实现并改用 Serialize&lt;&amp;str&gt;

fn main() {
    let mut s = Serializer;
    let a: String = "a".to_string();
    // autoderef &String to &str and call Serialize<&str>::to_bert()
    // I don't know why the autoderef does not work in your original example
    s.to_bert(&a);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2021-11-29
    • 2019-03-04
    • 2018-05-24
    相关资源
    最近更新 更多