Rust関数の説明
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関数についての詳しい情報は、BinaryDevelopの過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
-
CookieのSameSiteプロパティの概要
-
MACシステムアップグレード後、仮想マシンがブラックスクリーンになる問題の解決
-
5つのステップでは、ビデオを作成するために統一とWeChatの(ゲーム)小さなプログラムの相互作用を完了する
-
Gaussdb 200インストールデータスタジオjdbcアイデアリンクナニーレベルのインストール手順
-
スクラッチ3.0二次開発におけるスクラッチブロックのコンパイルフリー改造問題
-
Webからイントラネットへの浸透のプロセスを詳しく解説
-
GitコンフィギュレーションへのConfig Server接続のコツ
-
WordPressの投稿をカスタムフィールドで並べ替える方法
-
Unityアニメーションについて ステートマシン アニメーター活用術 チュートリアル
-
Rustによるファイル操作の例を解説
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン