Rust 関数

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