Rustチートシート

    • あくまで自分用なので雑なのは許してください(学んだものから更新しているので統一性はありません…)

 

    2022/12/20 リアルタイムで勉強中なのでどんどん更新していきます

変数

    • ミュータブルとイミュータブル

 

    • 定義した変数に再代入したい時はmutをつける

 

    • fn main(){

 

    • let mut s1 = String::from(“hell”);

 

    • s1 = String::from(“hello”);

 

    • let s2 = (“world”);

 

    • let s3 = s1 + s2;

 

    • println!(“{}”, s3);

 

    }

所有権

fn main(){
    let s1: String = String::from("Hello");
    let s2: &str = "World";
    println!("{}", add_string(s1, s2));
}

//sは変更したいのでミュータブルのString型で受け取る
//tは変更するう必要がないので参照だけを受け取る
fn add_string(s: String, t: &str) -> String{
    s + t
}

結合

文字列結合

    • 結合される側はString型、結合する側は文字列リテラル(結合される側は変更されるためミュータブルである必要があるが、結合する側は変更されないのでイミュータブルでよい)

 

    • fn main(){

 

    • let mut s1 = String::from(“hello”);

 

    • let s2 = (“world”);

 

    • let s3 = s1 + s2;

 

    • println!(“{}”, s3);

 

    }

構造体

    • 定義

 

    • struct User {

 

    • username: String,

 

    • email: String,

 

    • sign_in_count: u64,

 

    • active: bool,

 

    • }

構造体メソッド定義
impl User{
//引数にselfを持たせないことでstaticメソッドとして定義できる
pub fn new(username: String, email: String, sign_in_count: u64, active: bool) -> Self{
Self{username: username, email: email, sign_in_count: sign_in_count, active: active}
}
//通常の構造体メソッド
pub fn print_name(self){
println!(“{}”, self.username);
}
}

メソッド呼び出し
let user: User = User::new(String::from(“revioness”), String::from(“revioness.outlook.jp”), 1, true);
user.print_name();

インスタンス化
let user1 = User {
email: String::from(“someone@example.com”),
username: String::from(“someusername123”),
active: true,
sign_in_count: 1,
};

参照
println!(“email:{}”, user1.email);

値の変更
let mut user1 = User {
email: String::from(“someone@example.com”),
username: String::from(“someusername123”),
active: true,
sign_in_count: 1,
};

今まで何度も言っているように、let 変数名で定義したものはイミュータブルになるので、値の変更ができない
なのでmutをつけてミュータブルにする
構造体のこの変数だけミュータブルに!といったことはできない
user1.username = String::from(“test123”);

省略形
let mut user1 = User {
email: String::from(“someone@example.com”),
username: String::from(“someusername123”),
active: true,
sign_in_count: 1,
};
let mut user2 = User {
email: String::from(“someone2@example.com”),
username: String::from(“someusername1234”),
..user1
};

activeとsign_in_countがuser1と同じ値が入る

タプル

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);

この場合、中の構造は同じだが、型はColor型とPoint型に分かれる

println!

    • そのまま出力

 

    • println!(“rect1 is {}”, 1);

構造体の出力
struct Rectangle {
width: u32,
height: u32,
}

fn main() {
let rect1 = Rectangle { width: 30, height: 50 };

// rect1は{}です
println!(“rect1 is {:?}”, rect1);
}

rect1 is Rectangle { width: 30, height: 50 }

さらに見やすく
struct Rectangle {
width: u32,
height: u32,
}

fn main() {
let rect1 = Rectangle { width: 30, height: 50 };

// rect1は{}です
println!(“rect1 is {:#?}”, rect1);
}

rect1 is Rectangle {
width: 30,
height: 50,
}

ファイル入出力

ファイル読み込み

use std::fs;
use std::error;
use std::io::Write;

//Stringで読み込み
let content = fs::read_to_string("ファイルパス")?;

//書き込み
let mut file = fs::File::create("ファイルパス")?;
file.write_all(buf).unwrap();

json

//Cargo.toml
[dependencies]
serde = { version = "1.0.152", features = ["derive"] }
serde_json = "1.0.91"

//src
use serde::{Serialize, Deserialize};

//構造体で継承
#[derive(Serialize, Deserialize)]


let json = serde_json::to_string("json文字列").unwrap();

Logger

    • env_logger

 

    • //Cargo.toml

 

    • [dependencies]

 

    • log = “0.4.0”

 

    • env_logger = “0.10.0”

//src
use env_logger;
use log::{error, warn, info, debug};

//デバッグレベル設定・初期化
env::set_var(“RUST_LOG”, “info”);
env_logger::init();

info!(“コメント”);

#出力
[2022-12-29T14:42:24Z INFO アプリ名] コメント