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.
"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
(Ayrıca, '& FnMut' ve' Box
huon
@dbaupp: Teşekkürler. Grip ve kötü seçilmiş ismi suçluyorum. : P –