2015-09-13 37 views
7

Rust'ta (Java'da olduğu gibi) jeneriklerin tip silinmesi var mı, yok mu? Kesin bir cevap bulamıyorum.Rust, genel türleri siliyor mu, yok mu?

+1

"tür silme" ile ne demek istediğinizi tanımlamanız gerekebilir. En kullanışlı yanıtlar: – Shepmaster

+1

@Shepmaster Generics için tip silme, Java ve Scala gibi JVM dillerinde iyi tanımlanmış bir kavramdır (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html). ama bildiğim başka bir dilde jenerik ile oluşmaz.Modern Java konusunda yetkin kişiler, "tip silme" nin ne anlama geldiğini bilir. – Iceberg

cevap

10

Genel bir işlev veya genel bir tür kullandığınızda, derleyici, her bir farklı tip parametresi için ayrı bir örnek oluşturur (oluşturulan kod üzerinde hiçbir etkisi olmadığı için ömür boyu parametrelerin yok sayıldığına inanıyorum). Bu işlem monomorfizasyon olarak adlandırılır. Örneğin, Vec<i32> ve Vec<String> farklı türlerdir ve bu nedenle Vec<i32>::len() ve Vec<String>::len() farklı işlevlerdir. Bu gereklidir, çünkü Vec<i32> ve Vec<String> farklı bellek düzenlerine sahiptir ve bu nedenle farklı makine kodlarına ihtiyaç vardır! Bu nedenle, no, hiçbir tür silme yok.

biz Any::get_type_id() kullanımı (şimdilik kararsız, yani bir gece derleyici ile derlenmelidir) aşağıdaki örnekte olduğu gibi, eğer:

#![feature(get_type_id)] 

use std::any::Any; 

fn main() { 
    let v1: Vec<i32> = Vec::new(); 
    let v2: Vec<String> = Vec::new(); 

    let a1 = &v1 as &Any; 
    let a2 = &v2 as &Any; 

    println!("{:?}", a1.get_type_id()); 
    println!("{:?}", a2.get_type_id()); 
} 

biz Vec iki örneğini farklı tip kimliklerini elde. Bu, Vec<i32> ve Vec<String>'un farklı türler olduğu gerçeğini destekler. Bununla birlikte, Rust'ta yansıtma kabiliyetleri sınırlıdır; Any, şu anda sahip olduğumuz her şeyden çok daha fazlası. Ad veya üyeleri gibi çalışma zamanı değeri hakkında daha fazla bilgi edinemezsiniz. Any ile çalışabilmek için (Any::downcast_ref() veya Any::downcast_mut() kullanarak derleme zamanında bilinen bir türe dönüştürmeniz gerekir.

+0

Sizin ve benim gibi katılmama benziyor^_^Belki de şu soruya bir nüans var. eksik ... – Shepmaster

+3

@Shepmaster: Java'da, tip parametrelerini hiç görmediği için silme işlemi yapılması gerekir. Örneğin, bir 'String' saklayabilirsiniz. 'ArrayList 'içinde, çünkü çalışma zamanında bir ArrayList ' diye bir şey yoktur; Bu sadece bir "ArrayList". Java'da jenerik kullanmanın tek avantajı, derleyicinin sizin için güvenli olduğu yerde dökümler yerleştirmesidir, oysa jenerik olmaksızın, oyuncuları kendiniz yazmanız gerekir (ve bunları yanlış anlayabilirsiniz). –

+0

Vec > 'hakkında ne var? – aochagavia