[英]Can I define a trait whose implementations must be `!Send`?
我想定義一個特征,該特征迫使它的實現者在任何情況下都不能發送到線程或在線程之間共享。 將特征標記為!Send
就足夠了,但是Rust似乎沒有允許我。
可能嗎?
示例( 操場 ):
#![feature(optin_builtin_traits)]
// This is a syntax error
//trait ThreadThing : !Send {}
// This doesn't work either
trait ThreadThing { }
impl !Send for ThreadThing {}
不,您不能!Send
ThreadThing
條件。 編譯器只是不支持這種邏輯。
如果某人可能使用您的板條箱創建一個隱式Send
的類型,則在其實現中的任何地方均不包含不安全的代碼,並僅通過ThreadThing
實現ThreadThing
使其不安全 -在這種情況下,您將使ThreadThing
unsafe trait
,表明某個地方存在不安全代碼,該代碼依賴於類型系統中無法描述的不變式:不變式“ Send
事物未實現ThreadThing
”。
如果很可能對於實現ThreadThing
的類型手動實現Send
只是不安全的-在這種情況下,您無需執行任何操作,因為手動實現Send
已經不安全了 。 如果ThreadThing
的實現者決定手動實現Send
,則他們不僅要保證自己的不變式,還要ThreadThing
的不變性。
答案是:是的,您可以在某些非常特定的條件下進行操作。 是否需要執行此操作是另一回事。
如果要否定的特征是,則可以為另一個特征定義否定特征實現:
因此,以下將工作( 操場 ):
#![feature(optin_builtin_traits)]
auto trait Scary {}
trait ThreadThing { }
impl !Scary for ThreadThing {}
但是,如果您嘗試這樣做,將無法正常工作:
impl !Send for ThreadThing {}
或者,如果Scary
不是自動特征。
但是請注意,通常不必標記特征!Send
以這種方式!Send
。 特質的具體實現將由Rust編譯器根據實現結構的內容標記為Send
或!Send
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.