Skip to content

Instantly share code, notes, and snippets.

@meganehouser
Last active April 25, 2022 16:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save meganehouser/a5ec875b454b83dfaf1ae83bceb1c34b to your computer and use it in GitHub Desktop.
Save meganehouser/a5ec875b454b83dfaf1ae83bceb1c34b to your computer and use it in GitHub Desktop.
Rustの個人的なメモ

Rustメモ

リテラル

  • 数字
let n1: f32 = 1.0f32;
let n2: isize = 0xF1A; // 16進数
let n3: isize = 0b11001; // 2進数
  • 文字列
    • raw文字列(&str)
let s1: &str = r"hello world";
let s2: &str = r#"hello world"#;
  • バイト文字列
let b1: u8 = b'A';
let b2: &[u8] = b"hello";
let b3: &[u8] = br#"hello"#;

変換

  • Option -> Result
let x = Some("foo");
assert_eq!(x.ok_or(0), Ok("foo"));

let x: Option<&str> = None;
assert_eq!(x.ok_or(0), Err(0));

File Dir 関連

パス関連

  • std::path::Pathとstd::path::PathBufは&strとStringの関係に相当する。(実体とスライス)
  • Pathを引数などに使う場合はT: AsRefを受け取る。
  • PuthBufのset_file_nameはfile_nameメソッドでファイル名と判定されたファイル名を置き換えてしまう。
    • 単純にファイル名を追加する場合はpushメソッドを使う。
use std::path::PathBuf;

fn main() {
    let mut p = PathBuf::from("/test/test/");
    p.set_file_name("bar.txt");
    assert_eq!(p, PathBuf::from("/test/bar.txt"));
}

File I/O

  • RustのファイルI/OにはBufReader, BufWriterを使いましょう
    • std::fs::Fileのwriteとreadはバッファリングされていないため
use std::fs;
use std::io::{BufWriter, Write};
fn main() {
    let b = b"test";
    let mut f = BufWriter::new(fs::File::create("rs.dump").unwrap());
    for _ in 0 .. 100_000_000 {
        f.write(b).unwrap();
    }
}
use std::{fs, mem};
use std::io::{BufReader, Read};
fn main() {
    let mut f = BufReader::new(fs::File::open("rs.dump").unwrap());
    let mut b: [u8; 4] = unsafe { mem::uninitialized() };
    for _ in 0 .. 100_000_000 {
        f.read_exact(&mut b).unwrap();
    }
}
  • FileをOpenしてstringとして読み込む場合、便利メソッドがある。
#![feature(fs_read_write)]

use std::fs;
use std::net::SocketAddr;

fn main() -> Result<(), Box<std::error::Error + 'static>> {
    let foo: SocketAddr = fs::read_to_string("address.txt")?.parse()?;
    Ok(())
}

GUIライブラリ

コマンドラインパーサー

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment