簡體   English   中英

沒有從實現 Rust 中的特征的結構推斷出特征?

[英]No trait inferred from structs that implement a trait in Rust?

我有 2 個結構,都實現了一個特征:

pub trait TFilter {
    fn getText(&self) -> String;
}

pub struct CommentFilter {
    comment: String
}

impl TFilter for CommentFilter {
    fn getText(&self) -> String {
        return self.comment;
    }
}

impl CommentFilter {
    pub fn from_text(context: &Context, text: String) -> Self {
        return CommentFilter {
            comment: text
        }
    }
}

// ---

pub struct RegExpFilter {
    text: String
}

impl RegExpFilter {
    pub fn from_text(context: &Context, text: String) -> Self {
        return RegExpFilter {
            text
        }
    }
}

impl TFilter for RegExpFilter {
    fn getText(&self) -> String {
        return self.text
    }
}



但是在嘗試編譯代碼時:

      let filter: dyn TFilter = if text.chars().nth(0).unwrap() == '!' {
                CommentFilter::from_text(context, text);
            } else {
                RegExpFilter::from_text(context, "test".to_string());
            };

我收到一個錯誤:

error[E0308]: mismatched types
   --> src/filter.rs:113:20
    |
113 |               } else {
    |  ____________________^
114 | |                 RegExpFilter::from_text(context, "test".to_string());
115 | |             };
    | |_____________^ expected trait object `dyn filter::TFilter`, found `()`

怎么了?

PS1。 我發現; 實際上受傷了,但現在我得到了:

預期特征 object dyn filter::TFilter ,找到 struct filter::CommentFilter

它不能檢測到他們實際上實現了這個特征嗎?

PS2。 我必須明確指定: dyn TFilter否則編譯器會從第一個if分支推斷它並檢測為CommentFilter (這顯然不適用於否定分支)。

嘗試不使用分號:

      let filter: dyn TFilter = if text.chars().nth(0).unwrap() == '!' {
            CommentFilter::from_text(context, text)
        } else {
            RegExpFilter::from_text(context, "test".to_string())
        };

由於編譯器不知道TFilter的大小,因此您需要將其存儲在包裝在 Box 中的堆上,如下所示:

      let filter: Box<dyn TFilter> = if text.chars().nth(0).unwrap() == '!' {
            Box::new(CommentFilter::from_text(context, text))
        } else {
            Box::new(RegExpFilter::from_text(context, "test".to_string()))
        };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM