さび-ジェネリック型

ジェネリックスは、異なるタイプの複数のコンテキストのコードを記述するための機能です。Rustでは、ジェネリックスはデータ型と特性のパラメーター化を指します。Genericsを使用すると、コードの重複を減らし、型安全性を提供することで、より簡潔でクリーンなコードを記述できます。ジェネリックスの概念は、メソッド、関数、構造、列挙、コレクション、および特性に適用できます。

ザ・ <T> syntaxtypeパラメーターとして知られ、ジェネリック構造を宣言するために使用されます。Tは任意のデータ型を表します。

イラスト:ジェネリックコレクション

次の例では、整数のみを格納できるベクトルを宣言しています。

fn main(){
   let mut vector_integer: Vec<i32> = vec![20,30];
   vector_integer.push(40);
   println!("{:?}",vector_integer);
}

出力

[20, 30, 40]

次のスニペットを検討してください-

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);
}

上記の例は、整数型のベクトルが格納できるのは整数値のみであることを示しています。したがって、文字列値をコレクションにプッシュしようとすると、コンパイラはエラーを返します。ジェネリックスは、コレクションをよりタイプセーフにします。

イラスト:一般的な構造

typeパラメーターは、コンパイラーが後で入力する型を表します。

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);
}

上記の例では、Dataという名前の汎用構造を宣言しています。<T>タイプは、いくつかのデータ型を示します。main()の整数インスタンスと文字列インスタンス、構造-機能は、2つのインスタンスを作成します。

出力

value is :350
value is :Tom

特性

特性を使用して、複数の構造にわたって動作(メソッド)の標準セットを実装できます。特性は次のようなものですinterfacesオブジェクト指向プログラミングで。特性の構文は次のとおりです-

特性を宣言する

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
   }
}

トレイトには、具体的なメソッド(本体のあるメソッド)または抽象的なメソッド(本体のないメソッド)を含めることができます。メソッド定義がトレイトを実装するすべての構造で共有される場合は、具体的なメソッドを使用します。ただし、構造体は、トレイトによって定義された関数をオーバーライドすることを選択できます。

メソッド定義が実装構造によって異なる場合は、抽象メソッドを使用してください。

構文-トレイトを実装する

impl some_trait for structure_name {
   // implement method1() there..
   fn method1(&self ){
   }
}

次の例では、構造体bookによって実装されるメソッドprint()を使用してトレイトPrintableを定義します。

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)
   }
}

出力

Printing book with id:1001 and name Rust in Action

ジェネリック関数

この例では、渡されたパラメーターを表示するジェネリック関数を定義しています。パラメータはどのタイプでもかまいません。パラメータのタイプは、その値をprintlnで出力できるように、Displayトレイトを実装する必要があります。大きい。

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);
}

出力

Inside print_pro generic function:
10
Inside print_pro generic function:
20
Inside print_pro generic function:
Hello TutorialsPoint