Pas - Genel Tipler
Jenerikler, farklı türlerde birden çok bağlam için kod yazma olanağıdır. Rust'ta jenerikler, veri türlerinin ve özelliklerinin parametrelendirilmesine atıfta bulunur. Jenerikler, kod tekrarını azaltarak ve tür güvenliği sağlayarak daha kısa ve temiz kod yazmanıza olanak tanır. Jenerik kavramı yöntemlere, işlevlere, yapılara, numaralandırmalara, koleksiyonlara ve özelliklere uygulanabilir.
<T> syntaxtür parametresi olarak bilinen, genel bir yapı bildirmek için kullanılır. T , herhangi bir veri türünü temsil eder.
Resim: Genel Koleksiyon
Aşağıdaki örnek, yalnızca tam sayıları depolayabilen bir vektör bildirir.
fn main(){
let mut vector_integer: Vec<i32> = vec![20,30];
vector_integer.push(40);
println!("{:?}",vector_integer);
}
Çıktı
[20, 30, 40]
Aşağıdaki pasajı düşünün -
fn main() {
let mut vector_integer: Vec<i32> = vec![20,30];
vector_integer.push(40);
vector_integer.push("hello");
//error[E0308]: mismatched types
println!("{:?}",vector_integer);
}
Yukarıdaki örnek, tamsayı türündeki bir vektörün yalnızca tam sayı değerlerini depolayabildiğini gösterir. Dolayısıyla, koleksiyona bir dize değeri göndermeye çalışırsak, derleyici bir hata döndürür. Jenerikler, koleksiyonları daha güvenli hale getirir.
Örnek: Genel Yapı
Type parametresi, derleyicinin daha sonra dolduracağı bir türü temsil eder.
struct Data<T> {
value:T,
}
fn main() {
//generic type of i32
let t:Data<i32> = Data{value:350};
println!("value is :{} ",t.value);
//generic type of String
let t2:Data<String> = Data{value:"Tom".to_string()};
println!("value is :{} ",t2.value);
}
Yukarıdaki örnek, Data adlı genel bir yapı bildirir . <T> türü bazı veri türünü gösterir. Ana () yapısı, bir tam sayı örneği ve bir dizi örneği - işlevi iki örneğini oluşturur.
Çıktı
value is :350
value is :Tom
Özellikler
Özellikler, birden çok yapı arasında standart bir davranışlar kümesi (yöntemler) uygulamak için kullanılabilir. Özellikler gibidirinterfacesNesne Yönelimli Programlamada. Özellik sözdizimi aşağıda gösterildiği gibidir -
Bir Özellik Bildirin
trait some_trait {
//abstract or method which is empty
fn method1(&self);
// this is already implemented , this is free
fn method2(&self){
//some contents of method2
}
}
Özellikler somut yöntemler (gövdeli yöntemler) veya soyut yöntemler (gövdesiz yöntemler) içerebilir. Yöntem tanımı, Özelliği uygulayan tüm yapılar tarafından paylaşılacaksa somut bir yöntem kullanın. Bununla birlikte, bir yapı, özellik tarafından tanımlanan bir işlevi geçersiz kılmayı seçebilir.
Yöntem tanımı uygulama yapılarına göre değişiklik gösteriyorsa soyut yöntemler kullanın.
Sözdizimi - Bir Özellik Uygulayın
impl some_trait for structure_name {
// implement method1() there..
fn method1(&self ){
}
}
Aşağıdaki örnekler , yapı kitabı tarafından uygulanan bir yöntem print () ile Yazdırılabilir bir özelliği tanımlar .
fn main(){
//create an instance of the structure
let b1 = Book {
id:1001,
name:"Rust in Action"
};
b1.print();
}
//declare a structure
struct Book {
name:&'static str,
id:u32
}
//declare a trait
trait Printable {
fn print(&self);
}
//implement the trait
impl Printable for Book {
fn print(&self){
println!("Printing book with id:{} and name {}",self.id,self.name)
}
}
Çıktı
Printing book with id:1001 and name Rust in Action
Genel İşlevler
Örnek, kendisine aktarılan bir parametreyi gösteren genel bir işlevi tanımlar. Parametre herhangi bir türde olabilir. Parametrenin türü, değerinin println tarafından yazdırılabilmesi için Display özelliğini uygulamalıdır! makro.
use std::fmt::Display;
fn main(){
print_pro(10 as u8);
print_pro(20 as u16);
print_pro("Hello TutorialsPoint");
}
fn print_pro<T:Display>(t:T){
println!("Inside print_pro generic function:");
println!("{}",t);
}
Çıktı
Inside print_pro generic function:
10
Inside print_pro generic function:
20
Inside print_pro generic function:
Hello TutorialsPoint