2014-11-06 31 views
3

考慮以下結構:發送和靜態封閉鏽的區別是什麼?

struct Promise1<T, Err> { 
    on_resolve:Option<|promised:T|: Send>, 
    on_reject:Option<|failed:Err|: Send>, 
} 

struct Promise2<T, Err> { 
    on_resolve:Option<|promised:T|: 'static>, 
    on_reject:Option<|failed:Err|: 'static>, 
} 

struct Promise3<'a, T, Err> { 
    on_resolve:Option<|promised:T|: 'a>, 
    on_reject:Option<|failed:Err|: 'a>, 
} 

有形,它們之間有什麼區別呢?

什麼是'發送'作爲綁定,以及爲什麼當提供發送時,我不再需要提供一生? Send正在生成的隱式生命週期是什麼?

具體來說,Send和'static作爲閉包邊界有什麼區別。

例如,這個工程:

let k:|int|:Send = |i:int| {}; 
let p:|int|:Send = |i:int| {}; 
Promise1 { 
    on_resolve:Some(k), 
    on_reject:Some(p) 
}; 

但這並不:

let k = |i:int| {}; 
let p = |i:int| {}; 
Promise1 { 
    on_resolve:Some(k), 
    on_reject:Some(p) 
}; 

錯誤:

error: mismatched types: expected `core::option::Option<'static |_|:Send>`, found 
`core::option::Option<|int|>` (expected bounds `Send`, found no bounds) 

......然而,這正常使用Promise2或Promise3與'靜態'分別。

回答

3

Send是「種」 http://doc.rust-lang.org/reference.html#built-in-traits

send : Able to be sent across task boundaries.

'static是一輩子那是特殊的:即持續整個程序的生命週期。

參考還包含Send另一照明部分:(我們沒有爲基準得到最佳佈局尚)http://doc.rust-lang.org/reference.html#type-kinds

Send : Types of this kind can be safely sent between tasks. This kind includes scalars, boxes, procs, and structural types containing only other owned types. All Send types are 'static.

所以這就是爲什麼你可以在某些情況下可以互換使用。

2

Why are we talking about a lifetime?

閉包嵌入一個環境,該環境可能包含或不包含對當前線程堆棧的引用。這個環境有一個生命週期界限,它表示它可以生存的最長持續時間,並且對應於任何嵌入式參考的最短生命週期,您可以用適當的表示法指示它。

  • 如果它包含當前線程堆棧的引用,則封閉的使用壽命不應超過壽命所述參考
  • 如果它包含靜態資源的引用,而不是掛線程堆棧從而,然後封閉件的壽命並不限於

'static是上界,因爲它提供了沒有限制,並且因此'static用於指示不存在任何壽命的約束。它巧妙地避免了一個特殊情況:總是存在一生的界限,只是有時它是「無限的」。

What does Send mean?

Send種類被施加到對象,以指示其可以經由信道安全地發送到另一個線程,例如。因此,它意味着所述對象不會引用當前線程堆棧,否則如果堆棧解開對象將包含懸掛引用!

Why does Send seem to imply 'static ?

  1. 如果對象沒有參考當前堆棧,其壽命綁定是'static
  2. Send意味着一個對象沒有參考當前堆棧

它是微不足道的,因此,Send意味着對象的使用期限爲'static

But...

其實有安全的方式來引用另一組的參考,例如在的fork-join並行,其中線程被稱爲保證它會超越線程借用引用。它是touched on here,似乎需要與Send不同的種類來精確指定數據如何安全共享。

+0

你能解釋一下''static'在所有權模型和釋放內存方面的工作原理嗎?我無法包裝我的頭,這意味着將參數傳遞給聲明瞭靜態生命週期的函數。通過的項目是否必須在程序的整個生命週期中生活?這是一種內存泄漏嗎? – jocull 2015-06-11 05:10:41

+0

經過一番實驗,我*認爲*我明白了...... http://is.gd/8KWutk「靜態」意味着給定的特質是靜態的 - 不是傳入的項目!這更有意義。 – jocull 2015-06-11 05:28:40

+0

@jocull:''static'意思是「程序的生命週期」。 (1)'&'static T'意味着這個'T'的實例必須和程序一樣長,它可以通過泄漏它(humpf ...)來實現,或者僅僅因爲它是一個「靜態」常量。 (2)'特性+'靜態'意味着該項目不應該包含一個小於''靜態'的生命週期的引用,它可以通過只包含'&'靜態T'或不包含任何引用來實現。 – 2015-06-11 06:22:06

相關問題