2015-01-08 13 views
13

Ben böyle bir şey için kullanılır. Ben böyle bir şey yapabilirsiniz:Rust'ta bir kapamayı nasıl saklarım?</p> <pre><code>struct Foo { pub foo: |uint| -> uint, } </code></pre> <p>Şimdi kapatma sözdizimi kullanılmıyor:

struct Foo<F: FnMut(uint) -> uint> { 
    pub foo: F, 
} 

Ama sonra oluşturmak Foo nesnenin tipi ne?

let foo: Foo<???> = Foo { foo: |x| x + 1 }; 
Ben de bir başvuru kullanabilirsiniz

:

struct Foo<'a> { 
    pub foo: &'a mut FnMut(uint) -> uint 
} 

Ama bunun nedeni: a) işaretçi DEREF yavaş olduğunu düşünüyorum ve b) şimdi aslında olmak biter FnMut türü için hiçbir uzmanlaşma yoktur Kullanılmış.

cevap

17

Bu yanlıştır: direkt eşdeğer Box<FnMut(uint) -> uint> olurdu. Bu, eski sözdiziminin gerçekte ne anlama geldiğini etkili bir şekilde ifade eder.

Düzeltme: Dbaupp'ın işaret ettiği gibi, bu doğru değil. || sözdizimini kullanan eski stil kapanışları, yığında depolanan kapanışlara başvurur ve bunları &'a mut FnMut(uint) -> uint ile eşdeğer hale getirir. Yığın ayrılan proc s idi ve Box<FnOnce(uint) -> uint> eşdeğeriydi (yalnızca bir proc numaralı telefonu arayabilirsiniz). Hata için özür dilerim.

Üçüncü kod snippet'inizde kullandığınız türde olduğu gibi, , one; Kapama türleri anonimdir ve doğrudan adlandırılamaz. Bunun yerine, yazmak istiyorum:

let foo = Foo { foo: |x| x + 1 }; 

Bir kapsamında kod yazıyorsanız sen ihtiyaç bir Foo istediğinizi belirtmek için, nereye yazacağımı:

let foo: Foo<_> = Foo { foo: |x| x + 1 }; 

_ tip sisteminin sizin için gerçek jenerik türden çıkmasını söyler.

azalan sırayla kullanmakolarak genel kuralıdır:

  • Jenerik parametreleri: struct Foo<F: FnMut(uint) -> uint>. Bu en verimli olanıdır, ancak belirli bir Foo örneğinin her kapağın farklı bir beton türü olduğu için yalnızca bir kapağını saklayabileceği anlamına gelir.
  • Özellik referansı: &'a mut FnMut(uint) -> uint. Bir işaretçi indirmesi var, ancak şimdi, uyumlu bir çağrı imzası olan herhangi bir kapatmaya bir referans kaydedebilirsiniz.
  • Kutulu kapaklar: Box<FnMut(uint) -> uint>. Bu, kapanmayı yığına ayırmayı gerektirir, ancak yaşamlar için endişelenmenize gerek yoktur. Referans olarak olduğu gibi, herhangi bir kapatmayı uyumlu bir imza ile saklayabilirsiniz.
+1

"Doğrudan eşdeğeri Box uint> olur. Bu, eski sözdiziminin gerçekte ne anlama geldiği anlamına gelir." Hayır, doğrudan eşdeğeri '& mut FnMut (uint) -> uint'dir.Sadece 'proc' bir tahsisi vardı (eski' proc' 'Box ...>') ile eşdeğerdir. – huon

+0

(Ayrıca, '& FnMut' ve' Box huon

+0

@dbaupp: Teşekkürler. Grip ve kötü seçilmiş ismi suçluyorum. : P –

İlgili konular