関数は何らかの処理を行なって必要に応じて結果を返す、名前が付けられた呼び出し可能な一連のプログラムコード
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);
}