スポンサーリンク

Rustやってみる(5)関数を定義・呼び出し

基本はそんなに複雑ではないのだが、呼び出すときに暗黙型変換してくれないらしく、明示的型変換(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);
}

genericsをやりたいが。

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 );

}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: