簡體   English   中英

如何聲明我想要一個包含對實現特質的東西的引用的結構?

[英]How do I state that I want a struct which contains a reference to something which implements a trait?

編者注:問題中顯示的代碼在Rust 1.0中按原樣編譯。

我試過了:

trait Inner {}

struct Outer<'a> {
    inner: &'a Inner,
}

但是編譯器抱怨:

   Compiling tst v0.1.0 (file:///home/chris/rust/tst)
/home/chris/rust/tst/src/main.rs:4:14: 4:19 error: explicit lifetime bound required
/home/chris/rust/tst/src/main.rs:4   inner: &'a Inner,

如何告訴Rust我想要一個包含對實現特征的東西的引用的結構?

有兩種方法。 首先,首選方法是使用泛型:

struct Outer<'a, T> {
    inner: &'a T,
}

impl<'a, T: Inner> Outer<'a, T> {
    // ...
}

由於所有函數調用都是靜態分派的,因此此方法最有效。 它也是最安全的類型,但是缺點是您必須在使用Outer<T>任何地方指定特征綁定,並且您將無法在不同的時間在同一結構中保留不同的Inner實現。 T必須事先知道。

另一種方法是使用特征對象:

struct Outer<'a> {
    inner: &'a (Inner + 'a),
}

這是您已經嘗試過的,看到的錯誤是由於未指定生存期限制而造成的:那+ 'a一件事情。 您需要指定一個生命周期限制,因為可以為具有生命周期參數的結構實現特質(例如Outer ),並且如果將這樣的結構裝箱成特征對象,則需要一種以特質對象類型指定其生命周期參數的方法。

特征對象的優點是注釋數量更少,並且只要滿足Inner bound,就可以將任意類型用作具有相同Outer值的inner字段。 不利的一面是您將獲得動態調度,這可能會稍微降低效率。 如果沒有其他機制,您也將無法找回特征對象的原始類型。

這是使用生存期說明符的結構的示例。

我必須創建一個結構體,該結構體是對SWide類型的SWide 該字段需要作為結構體內部的引用,因此我向結構體添加了生命周期說明符,還向impl添加了生命周期說明符,請注意,您必須在impl行中兩次使用相同的生命周期說明符:

extern crate mysql;

use mysql::Pool;
use swide::SWide;

pub struct Context<'a> {
    pub connection_pool: Pool,
    pub cache: Option<&'a SWide>,
}
impl<'a> Context<'a> {
    pub fn new_with_cache(connection_pool: Pool, cache: Option<&'a SWide>) -> Self {
        Context {
            connection_pool: connection_pool,
            cache: cache,
        }
    }
}

暫無
暫無

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

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