Bu cevap, bu soru tarafından motive edilen hata raporundaki cevaplara dayanmaktadır .
Rust her işlevi vardır tek tek işlev öğesi türü her fonksiyon işlev öğesi türünden farklı olduğu,. Bu nedenle, işlev öğesi türünün bir örneğinin herhangi bir bilgi depolaması gerekmez - hangi işleve işaret ettiği türünden anlaşılır. Yani x değişkeni
let x = foo;
0 boyutunda bir değişkendir.
İşlev öğesi türleri , gerektiğinde işaretçi türlerine dolaylı olarak zorlar . Değişken
let x: fn() = foo;
imzalı herhangi bir işleve genel fn()
bir işaretçi olduğundan, gerçekte işaret ettiği işleve bir işaretçi depolaması gerekir, bu nedenle x
boyutu bir işaretçi boyutudur.
Bir işlevin adresini &foo
alırsanız, aslında sıfır boyutlu geçici bir değerin adresini alıyorsunuz demektir. Bu rust
repo işleminden önce , sıfır boyutlu geçişler yığın üzerinde bir ayırma oluşturmak için kullanılır ve &foo
bu ayırmanın adresini döndürür. Bu işlemden bu yana, sıfır boyutlu türler artık ayırma oluşturmaz ve bunun yerine sihirli adres 1'i kullanır. Bu, Rust'un farklı sürümleri arasındaki farkı açıklar.
foo
zaten bir işlev işaretçisi olduğundan, ona bir adres almamalısınız. Bu, görünüşte sıfır boyutlu bir türe (dolayısıyla sihirli değer1
) çift referans oluşturur .