LoginSignup
20
13

More than 3 years have passed since last update.

Rustの文法を学ぶ

Last updated at Posted at 2019-10-29

https://doc.rust-jp.rs/book/second-edition/ を読みながらRustを触っているので、基本的な文法をまとめていきます。所有権, 参照, ライフタイムなどは割愛します。

ソースコードはRust 1.38.0で動作確認しています。

変数

// immutable
let num1 = 1;

// mutable
let mut num2 = 2;
num2 = 4;

//shadowing
let num3 = 3;
let num3 = "3";
  • letで変数定義
  • デフォルトでは不変。mutを使うと可変になる
  • 既存の変数と同名の変数を定義することで既存の変数にアクセスできなくする(シャドーイング)

定数

const NUM: i32 = 1;
  • 常に型注釈が必要
  • どのスコープでも定義可能
  • 定数名はscreaming snake case

データ型

整数型

let num: i32 = 1;

i32, u32, i64など

浮動小数点型

let num: f32 = 1.2;

f32, f64

論理値型

let b: bool = true;

bool

文字型

let c: char = 'a';

char

タプル型

let (x, y, z) = (1, 2, 3);

let x = (1, 2);
println!("{}{}", x.0, x.1);
// 12
  • ()で囲んだ値
  • 複数の値, 複数の型を持つことができる
  • パターンマッチングで要素を分解できる
  • x.0のようにインデックスでアクセスできる

配列型

let array = [1, 2, 3];
  • 固定長
  • スタックに格納される

条件式

let a = 0;
if a == 0 {
  println!("zero");
}

let a = 1
let num = if a >= 0 {
  "positive number"
} else {
  "negative number"
};

if 条件式 { 本体1 } else { 本体2 }

ループ

// loopを使ったループ
let i = 0;
loop {
  if i > 10 {
    break;
  }
  i += 1;
}

// whileを使ったループ
let i = 0;
while i <= 10 {
  i += 1;
}

// forを使ったループ
for i in 1..10 {

}

構造体

struct User{
  first_name: &'static str,
  last_name: &'static str,
  age: u32,
}

fn main(){

  let yamada_taro = User {
    first_name: "Taro",
    last_name: "Yamada",
    age: 20,
  };

  //構造体更新記法
  let first_name = "Jiro";
  let last_name = "Yamada";
  let age = 20;
  let yamada_jiro = User {
    first_name,
    last_name,
    age,
  };
}
  • structで構造体を定義
  • 構造体のメンバと同じ変数を使うことで構造体の値のセットを構造体更新記法を使って省略して書くことができる

タプル構造体

struct Point(i32, i32);

fn main(){
  let point = Point(1, 2);
}

メソッド

struct User{
  first_name: &'static str,
  last_name: &'static str,
  age: u32,
}

impl User {
    fn new(first_name: &'static str, last_name: &'static str, age: u32) -> User {
        User {
            first_name,
            last_name,
            age,
        }
    }

    fn get_full_name(&self) -> String {
        self.first_name.to_string() + self.last_name
    }
}

fn main(){
  let user = User::new("Taro","Yamada",1);
  let full_name = user.get_full_name();
}
  • implを使ってメソッドを実装
  • selfで構造体にアクセス
  • 引数なしの関数は関連関数になる

enum

enum Language {
    Java(bool),
    Kotlin(i32, i32),
    Rust(i32),
}

fn main(){
    let java = Language::Java(true);
    let kotlin = Language::Kotlin(1, 2);
    let rust = Language::Rust(1);
}
  • enumで列挙子を表現する

Option

enum Option<T> {
  Some(T),
  None
}

fn main(){
  let optional_num: Option<u32> = Some(10);
}
  • 値があるかどうかを表現する
  • 初期化処理に含まれているため、接頭辞なしでSome(T)のように使うことができる

Result


enum Result<T, E>{
  Ok(T),
  Err(E),
}
  • エラーが発生したかどうかを表現する
  • エラーが発生しなければOk(T), エラーが発生した場合Err(E)を使う

match

let age = 10;

let is_ten = match age {
  10 => true,
  _ => false,
};
  • matchでパターンマッチをおこなうことができる
  • _を使うことでデフォルトのケースを表現できる
20
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
13