1. ホーム
  2. Web プログラミング
  3. 関連情報

Rust関数の説明

2022-01-17 08:38:41

Rustは様々なプログラミングパラダイムをサポートしていますが、より関数的な性質を持っています。Rust では、関数は第一級市民であり、プログラムの中でデータとして渡すことができます。C や C++ のように、Rust には独自のプログラムエントリーポイントがあります。 main 関数を使用します。

: プログラム入力 main 機能

fn main() {
    println!("Hello, world!");
}


Rustは fn キーワードを使用して関数を宣言し、定義します。 snake case すなわち、文字はすべて小文字で、単語はアンダースコアで区切られる。関数はパラメータを持つことができ、各関数は戻り値を持つ。

関数引数

パラメータ宣言方法:パラメータ名+コロン+パラメータ型

// Define a parameterless function
fn function() {
    println!("A function with no parameters.");
}

// Define a function with parameters
fn hello(name: &str) {
  println!("Hello, {}. ", name);
}


関数の戻り値

Rustのすべての関数には戻り値があります。 main 関数も例外ではありません。 main の値を返します。 () (空のタプル)です。Rustでは、関数が () の場合、戻り値の型の宣言を省略することができます。 main 関数の完全な形は次のようになります。

  fn main() -> () {
    /  }


() と呼ばれることが多いようです。 unit または unit type というのは、実はC/C++、Java、C#のvoid型と似ている。

関数が他の型の戻り値を持つ場合、その関数に対応するために -> を使用して、戻り値の型を明示的に示します。C/C++やJavaのような言語には return ステートメントを使用して値を返します。Rustはそれらと異なり、デフォルトで関数内の最後の式の結果を戻り値として受け取ります。

: 戻り値を持つ関数を定義する

fn main() {
    let x = plus_one(5);

    println!("The value of x is: {}", x);
}

fn plus_one(x: i32) -> i32 {
    x + 1
}


また、Rustは return というキーワードがありますが、これは一般的に早く返すために使われます。

: を使用します。

return
fn main() {
  let a = [1,3,2,5,9,8];
  println!("There is 7 in the array: {}", find(7, &a));
  println!("There is 8 in the array: {}", find(8, &a));
}
fn find(n: i32, a: &[i32]) -> bool {
  for i in a {
    if *i == n {
      return true;
    }
  }
  false // This could also be changed to `return false; `, but that's not Rust programming style
}

!

Rustにはもう一つ、戻り値のない関数があります。 分岐関数 (発散関数)です。実は、これは何も返さず、感嘆符を使っています。 fn main() { println!("hello"); diverging(); println!("world"); } fn diverging() -> ! { panic!("This function will never return"); } を戻り値の型として使用します。

panic!

発散関数は、一般に次のように設定されます。 fn マクロ呼び出しなど、他の拡散関数を呼び出すことができるため、拡散関数を呼び出すと現在のスレッドがクラッシュしてしまいます。

高次関数

高階関数は、通常の関数と異なり、1つ以上の関数を引数として使用でき、関数を戻り値として受け取ることができる関数です。関数は引数や戻り値として使用できるので、それに対応するデータ型である関数ポインタ型も持っていなければなりません。

関数ポインタ型

関数ポインタ型 使用方法 // function definition fn inc(n: i32) -> i32 { n + 1 } // Use `type` to give the function pointer type an alias type IncType = fn(i32) -> i32; fn main() { // use function pointer type `fn(i32) -> i32` let func: fn(i32) -> i32 = inc; println!("3 + 1 = {}", func(3)); // use the function pointer type alias `IncType` let func: IncType = inc; println!("4 + 1 = {}", func(4)); } このキーワードは、コンパイル時に、関数のパラメータと戻り値の型は分かっているが、関数本体が不明な関数を指し示します。

fn main() {
  println!("3 + 1 = {}", process(3, inc));
  println!("3 - 1 = {}", process(3, dec));
}
fn inc(n: i32) -> i32 {
  n + 1
}
fn dec(n: i32) -> i32 {
  n - 1
}
// process is a higher-order function with two arguments, one of type `i32` and the other of type `fn(i32)-> i32`
fn process(n: i32, func: fn(i32) -> i32) -> i32 {
  func(n)
}


パラメータとしての機能

引数としての関数は、通常の引数と同様に宣言します。

高次関数

fn main() {
    let a = [1,2,3,4,5,6,7];
    let mut b = Vec::<i32>::new();
    for i in &a {
        b.push(get_func(*i)(*i));
    }
    println!("{:?} ", b);
 }

 // return `inc` if the passed argument is even, otherwise return `dec`
 fn get_func(n: i32) -> fn(i32) -> i32 {
    fn inc(n: i32) -> i32 {
        n + 1
    }
    fn dec(n: i32) -> i32 {
        n - 1
    }
    if n % 2 == 0 {
        inc
    } else {
        dec
    }
}


戻り値としての関数

戻り値としての関数は、通常の関数の戻り値型宣言と同じように宣言します。

fn main() {
    let a = [1,2,3,4,5,6,7];
    let mut b = Vec::<i32>::new();
    for i in &a {
        b.push(get_func(*i)(*i));
    }
    println!("{:?} ", b);
 }

 // return `inc` if the passed argument is even, otherwise return `dec`
 fn get_func(n: i32) -> fn(i32) -> i32 {
    fn inc(n: i32) -> i32 {
        n + 1
    }
    fn dec(n: i32) -> i32 {
        n - 1
    }
    if n % 2 == 0 {
        inc
    } else {
        dec
    }
}


関連情報

Rust プログラミング言語

Rust リファレンス

例で見るRust

RustPrimer

Rustの関数に関する記事は以上です。Rust関数についての詳しい情報は、BinaryDevelopの過去の記事を検索するか、以下の記事を引き続きご覧ください。