【Rust】基礎と使い方

Rustという言語をご存知でしょうか。
Mozillaプロジェクトが開発している言語です。
c言語やc++波の性能があり、将来的にはc++の代わりになるプログラミング言語を目標としているそうです。
有名な言語に比べて世界にはそこまで浸透はしていないかもしれませんが(違ってたらすみません)、気になったので記事にしたいと思いました。
システムプログラミング言語であり、OSなどいろいろ作れるそうですよ。
誰かがRedoxっていうOSを作ってました。

前置きはほどほどにしてRustの文法などをここに残しておきたいと思います。

Hello World

画面に文字列を出力するだけのサンプルです。

fn main() {
  println!("Hello World");
}

rustcコマンドでコンパイルします。

rustc hello.rs -o hello

配列を作成しループして偶数のみ表示するサンプルです。

fn main() {
  let arr = [1,2,3,4,5,6,7,8,9];
  for a in arr.iter() {
    if a%2 == 0 {
      println!("number is {}",a); 
    }
  }
}

関数の定義は以下のようにします。
x: i32という方の定義の仕方をしてますね。
scalaやらswiftがこんな書き方をしていたような
ちなみにi32は符号付きのint型です。
u32が符号なしint型
i64が符号付きlong型
u64が符号なしlong型
他にもf32やf64など

fn main()
{
  print_number(5)
}

fn print_number(x : i32)
{
  println!("number is: {}",x)
}

標準入力から文字列を受け取りそれを出力するサンプルです。

use std::io;

fn main() {
  let mut str = String::new();
  io::stdin().read_line(&mut str).expect("failed");
  println!("inpur is {}", str);
}

Rustの難しいところ

僕が難しいと思ったことは所有権という概念です。
こんなソースコードがあるとします。

fn main() {
  let str1 = String::from("hello world");
  let str2 = str1; 
  println!("str2 is {}",str2);
  println!("str1 is {}",str1);
}

これをコンパイルすると怒られます。
こんな感じで。
error[E0382]: use of moved value: str1
これはhello worldという文字列に対する参照(所有権)がstr1からstr2へと動いたから生じるようです。
let str1 = String::from(“hello world”);
の一文でhello worldという文字列がヒープ領域に置かれ、そのアドレスをstr1が参照するようになります。
そして
let str2 = str1;
の一文で参照がstr1からstr2へと転送されます。
ですからstr1からは文字列を参照することが出来なくなるみたいです。
Rustは参照元が2つ以上あるということが気に食わないということですかね。

ちなみにこんな感じだとコンパイルが通ります。

fn main() {
  let str1 = String::from("hello world");
  let str2 = str1.clone();
  println!("str2 is {}",str2);
  println!("str1 is {}",str1);
}

let str2 = str1.clone();
の時にcloneして代入しています。
これにより新しくhello worldという文字列がヒープに置かれ、そのアドレスをstr2が参照するようになります。
ですから参照の転送はおこりません。

i32やu32などのプリミティブ型にはcopyトレイトというものが実装されているようで、上記のような問題は起こりません。
参照ではなく値そのものがコピーされるからです。
copyトレイトが実装されていない型だとこのような問題が起こるということですかね。vectorとか。

最後に

簡単に少しだけRustについてまとめました。
所有権の部分に関しては自分も完全に理解できているかわからないので不備があったらご指摘いただきたいです。
Rustって所有権の他にも他の言語にはないような新しい概念が結構あるのかなとやっていて思いました。
世間的にも習得難易度が高いと認識されているようです。
いずれにしろあと数年もすればさらにもっと世間に浸透すると思うので、その時にまた勉強しようかなと思います。
たぶん何かを作りながら覚えていったほうがいいと思いますわ。