関数は何らかの処理を行なって必要に応じて結果を返す、名前が付けられた呼び出し可能な一連のプログラムコード
fn name([args: type])[->(returns)]{
statement,
expr
}
※argsは関数の引数, returnは戻り値の型
fn printi32 (n: i32) { println!("値は{}", n); } fn twice(n: i32) -> i32 { 2 * n }
関数を呼び出すときには引数に適切な値を指定して呼び出す
fn is_even(n: i32) -> bool { (n % 2) == 0 } fn main(){ let n = 12; if is_even(n){ println!("{}は偶数です", n); } else { println!("{}は奇数です", n); } }
複数の引数を使う関数
fn main(){ let a = 2; let b = 3; let x = add(a, b); println!("a+b={}", x); } fn add(a: i32, b: i32) -> i32 { a + b }
複数の戻り値を返す関数
-> 戻り値を囲んだタプルとして返す
fn main(){ let a = 20; let b = 3; let (x, y) = divid(a, b); println!("a/b={}...{}", x, y); } fn divid(a: i32, b: i32) -> (i32, i32) { ( a / b, a % b) }
関数の最後に記述した式は関数の値として返すことができるが、関数の途中で値を返すことこもできる
use std::io; fn main() { println!("整数を入力してください。"); let mut s = String::new(); io::stdin().read_line(&mut s).ok(); let v:i32 = s.trim().parse().ok().unwrap(); let x = abs(v); println!("abs({})={}", v, x); } fn abs(n: i32) -> i32 { if n < 0 { return -n } n }
参照による引数の受け渡し
fn main() { let s = String::from("Hello"); let x = get_length(&s); println!("{}の長さ={}", s, x); } fn get_length(x: &String)-> usize { x.len() }
### ジェネリック引数の関数
関数の引数を任意の型にすることもできる
fn type_of
std::any::type_name::
}
struct Point { x: i32, y: i32, } fn main() { let n = 1; println!("{}", type_of(n)); let x = 7.0; println!("{}", type_of(x)); let p = Point {x: 10, y: 20}; println!("{}", type_of(p)); } fn type_of<T>(_: T) -> &'static str { std::any::type_name::<T>() }
### 戻り値を使った所有権の返却
fn main() { let mut msg = String::from("Hello"); println!("msg={}", msg); msg = upper(msg); println!("msg={}", msg); } fn upper(s: String) -> String { println!("s={}", s.to_uppercase()); s }
### クロージャー
名前のない関数
move |x| { println!("x={}", x); }