https://exercism.org/tracks/rust/exercises
https://learn.microsoft.com/ko-kr/training/paths/rust-first-steps/
https://www.rust-lang.org/learn
https://rinthel.github.io/rust-lang-book-ko/
https://velog.io/@peeeeeter_j?tag=Rust
https://play.rust-lang.org/
https://www.youtube.com/watch?v=W9DO6m8JSSs&list=PLfllocyHVgsSJf1zO6k6o3SX2mbZjAqYE&ab_channel=mithradates
pub → public, 외부 세계에서도 엑세스할 수 있도록 설정
그럼, 따로 설정 안하면 private으로 설정되는 걸까?
cargo → 패키지 매니저, c 라이브러리보다 비교할 수 없을 정도로 편하게 해준다. (Makefile 필요없도록, 근데 복잡하긴 한가봄)
보통은, cargo로 새 패키지를 생성하고, src/lib.rs에서 소스코드를 작성하는 식으로 진행
$ cargo new hello
$ cd hello
$ tree
.
├── Cargo.toml
└── src
└── lib.rs
함수 형태? → 일단 fn으로 정의하고, input은 그대로인듯? 대신 output이 "-> {형태}" 식으로 정의함
pub fn hello() -> &'static str {~}
세미콜론도 그렇고 신기하네
왜냐하면, vscode에서 짤때는 아래처럼 했거든
fn main() {
println!("Hello, world!");
}
fn → 함수 선언할 때 쓰인다~
c, c++처럼 main에서 시작한다
function은 "name: &str" 처럼 input을 받을 수 있다.
그리고, return을 "-> &str"로 반환할 수 있다.
매 코드마다 아래처럼 Cargo.toml이 있어 → 뭘까? → 일단 Cargo로 패키지 만들때 자동으로 생성되는 거로 보임
[package]
name = "lucians-luscious-lasagna"
version = "0.1.0"
edition = "2021"
unimplemented!() 같은 함수도 있어... ㄷㄷ
let → 변수 선언
//, /* */ → c, c++처럼 주석
/// → document를 위한 주석처리
//! → document에서 내부 코멘트를 위한 주석처리
enum 사용법
pub enum NAME {
name1,
name2,
name3,
}
match 사용법
match level {
LogLevel::Info => "[INFO]: ".to_string() + message,
LogLevel::Warning => "[WARNING]: ".to_string() + message,
LogLevel::Error => "[ERROR]: ".to_string() + message,
}
"NAME".to_string() 으로 소쉽게 String 타입으로 변형 가능!
derive란...
derive 속성은 여러분이 derive 문법을 명시함으로써 생성할 수 있는 기본 트레잇 구현체를 생성해줍니다.
https://rinthel.github.io/rust-lang-book-ko/appendix-03-derivable-traits.html 에서 자세한 설명이 있는데,
두고 두고 읽어봐야할듯... 옵션이 굉장히 많네
예를 들어, Debug를 사용하면 프로그래머 출력이 가능하고,
PartialEq, Eq를 사용하면 ==, != 연산자를 사용할 수 잇음
이외에도 PartialOrd, Ord, Clone, Copy, Hash, Default 등등이 존재하네
일단 답지 보고 했는데... 오...
match의 사용법을 정확히 하는게 좋을 것 같음
이거 거의 Switch문의 완전 개선판인데?
pub fn sublist<T: Eq>(a: &[T], b: &[T]) -> Comparison {
use Comparison::*;
match (a.len(), b.len()) {
(0, 0) => Equal,
(0, _) => Sublist,
(_, 0) => Superlist,
(m, n) if m > n => if a.windows(n).any(|v| v == b) {Superlist} else {Unequal},
(m, n) if m < n => if b.windows(m).any(|v| v == a) {Sublist} else {Unequal},
(_, _) => if a == b {Equal} else {Unequal},
}
}
!가 붙은 함수들이 있는데, (e.g., println!, vec!)
이것들은 매크로 함수라고 함!
보통 그냥 함수라고 봐도 되는데, 매크로 함수의 차이점이라고 하면...
매개변수의 개수를 가변적으로 처리할 수 있음!!!
https://rinthel.github.io/rust-lang-book-ko/appendix-04-macros.html 에 자세한 내용이 있는데,
"또한 매크로는 컴파일러가 코드의 의미를 해석하기 이전에 작동합니다. 따라서 주어진 타입에 트레잇을 구현하는 등, 런타임에 호출되는 함수로는 불가능한 일을 할 수 있습니다."
음... 뭔가 특별한 동작을 수행할 수 있게 되나 보네?