基本はそんなに複雑ではないのだが、呼び出すときに暗黙型変換してくれないらしく、明示的型変換(as f32) を入れないといけないらしい。
// 関数定義 // 値渡し fn add(a:f32,b:f32)->f32{ return a+b; } fn main() { // 関数呼び出し // 引数に整数を入れてもaddのf32に暗黙変換できないらしいので // as f32 で実数に型変換する let k = add(3 as f32,5 as f32); println!("k= {}",k); }
不変参照で渡すときは渡す側と受ける側で&をつける。
// デフォルトで不変参照。C++でいうところのconst。kの内容を変更できない fn add2(k: &i32)->f64{ // &mutでないときは *k としなくていいらしい return (k + 2) as f64; }
fn main() { let a:i32=3; // mutがついていないので変更不可 println!(" {}", add2(&a) ); // aの定義時にmutをつけていないのでここもただの& }
可変参照は型名の前に&mut をつける。
呼び出す側でも&mutが必要。
さらにこの値を使うときは参照外しとして*をつけなければならない。もっとほかの記号はなかったのか。
// &mut で可変参照 fn swap(i:&mut i32,j:&mut i32){ let k:i32; // &mutの時は頭に*をつけて *i とする k = *i; *i = *j; *j = k; }
fn main() { let mut a:i32=3; let mut b:i32=8; swap(&mut a,&mut b); println!("{} {}",a,b); }
C++のテンプレートのようなgenericsという機能があるが、ただ<T>としただけでは動かない。printlnすらできない。いずれ詳しく調べる。
https://www.koderhq.com/tutorial/rust/generics/
use std::ops::Mul; fn square<T: Mul<Output = T> + Copy >(val:T)->T{ return val*val; }
use std::fmt::Display; fn console_log<T: Display> (x: T) { println!("{}", x); }
fn main() { println!("{}", square(3) ); console_log( 3 ); }