Skip to content

Latest commit

 

History

History
102 lines (69 loc) · 4.79 KB

README.md

File metadata and controls

102 lines (69 loc) · 4.79 KB
by just-do-halee

Today I learned

2022-8-31


  • Rust::Error

    • #[non_exhaustive] 속성은 [Error enum] 위에 항상 붙여줘야 한다.

      • 붙여줄 경우 그 enum을 외부 모듈에서 match 해 사용할 시
        ...
        use FooError::*; // enum FooError { FirstError, SecondError }
        match e {
          FirstError => ...,
          SecondError => ...,
          _ => ...,
        }
        ...
      • 반드시 더 이상 매칭할 분류가 존재하지 않음에도 그 외의 모든 것을 뜻하는 _(언더스코어) 매칭을 사용해야만 하고, 이는 사용자 측면에서 라이브러리가 업데이트 됐음에 사용자 코드를 깨지 않아도 되게끔 하는, Error 측의 의미론적 major버전의 붕괴를 방지할 수 있게 한다.

  • Rust::Test

    • #[should_panic] 속성은 [Test fn] 위에 붙여 줄 수 있으며, 이는 test running 시 이 함수가 panic!() 되어야 함을 선언한다.

    • cargo testDoc-tests 는 오직 --lib crate에서만 동작하며 --bin crate에서는 동작하지 않는다.

    • 최대한 모든 테스트는 라이브러리 내에서 이루어지도록 하고, 어플리케이션에서는 최소한의 코드로 작동하게끔 해야 한다.

      • 그럼에도 불구하고 꼭 어플리케이션 테스트를 하고 싶다면, 별도로 테스트용 바이너리를 만들어 cfg!(target_os = "...") 를 이용 각 OS에 맞춘 process::Command::new("...")... 커맨드 입력으로 직접 바이너리를 실행시키도록 해 테스트를 만들어 본다.

  • Rust::Bench

    • Benchmarking 시에는 정말 퍼포먼스가 중요한 지점만을 골라 파악하며, 최대한 실제 제품 시의 환경(Hardware, OS, Rust Version, etc...)과 똑같은 환경을 구축해 시행해야 한다.

    • criterion과 같은 외부 benchmarking core crate를 사용할 시에는 항상 Cargo.toml 내에

      [[bench]]
      name = "rs_file_name_inside_benches"
      harness = false
      • harnessfalse로 해야만 한다. harness 는 (built-in test도 포함) (현) nightly버전의 unstable한 feature들을 이용한 Rust built-in benchmarking을 활성화시키는 옵션이다. 기본값은 true로서 켜져 있다.

  • Rust::Log

    • Standard library에 log는 포함되지 않는다. 그러나 Official Library는 존재하는데, 그것이 log crate이다.
      use log::{error, warn, info, debug, trace};
      // 런타임 때 log-level이 결정되는데,
      // log-level이
      error!("Serious stuff"); // error일 경우에는 error만,
      warn!("Pay attention"); // warn일 경우에는 error, warn까지만,
      info!("Useful info"); // info일 경우에는 error, warn, info,
      debug!("Extra info"); // debug일 경우에는 error, ..., debug,
      trace!("All the things"); // trace일 경우에는 trace, 위의 모든 것 포함해
      // 로그가 출력이 된다.
      // * 참고
      // error = highest priority
      // trace = lowest priority
    • log crate은 단순히 모든 logger library들이 따라야 하는 밑바탕 trait을 구현한 추상 인터페이스의 뼈대일 뿐으로, 실제 logging이 시행되기 위해서는 상위 라이브러리를 또 추가해 execute해야 한다.

  • Rust::ETC

    • 1.59 버전 이후부터는
      let _ = foo(); // 를
      _ = foo(); // 이렇게 바꿔 사용한다.

  • OS::Basic

    • 컴퓨터가 켜지면, 운영체제(Operating System: OS)의 프로그램 코드는 RAM 상에 올라간다. 이때 그 올라간 공간을 OS space라고 부른다. 반면, 남은 공간을 User space라고 부른다.
    • 프로그램이라는 것은 기본적으로 사람이 읽을 수 있는 Source Code로서 존재하다가, Compiler라는 다른 프로그램을 사용하여 컴퓨터가 읽어낼 수 있는 Machine Code로 변형시킨 그, 0과 1만으로 이루어진 바이너리 파일(Binary File: Bin File)자체를 의미한다.
    • 바이너리 파일은 Hard Disk에 존재하다가, 실행 될 시에 RAM의 User space로 옮겨지는데, CPU가 그 Machine Code를 하나씩 하나씩(Instruction by Instruction) 읽어들여 계산해(Calculate) 프로그램을 진전(실행)시킨다.
    • 이후 종료된 프로그램은 RAM 상에서 (공간이 무제한이 아니기에, 다른 프로그램도 와야 하므로) 지워져야 하고, 이를 메모리상에서 Free되었다고 표현한다.