목록개발 및 공부/언어 (68)
NeuroWhAI의 잡블로그
주의! 공부하고 정리한 글이라서 틀린 부분이 있을 수 있습니다.올바른 지적은 언제나 환영합니다. Rust는 패턴 매칭시 적절한 바인딩 모드를 선택함으로써 프로그래머 입장에서 쉽게 패턴 매칭 코드를 작성할 수 있게 합니다.다만 구버전 Rust까지는 그런 기능이 부족해서 아래 코드는 컴파일이 안되었었습니다. let s: &Option = &Some("hello".to_string()); match s { Some(s) => println!("s is: {}", s), _ => (), };s는 &Option인데 패턴은 Option이기 때문이었죠.그래서 아래처럼 수정해야 했었습니다. let s: &Option = &Some("hello".to_string()); match s { &Some(ref s) => p..
panic은 Rust의 매크로로서 프로그램이 복구할 수 없는 오류에 빠졌을 때 프로그램을 즉시 종료하고 디버깅에 필요한 정보를 제공하는 기능을 합니다.Rust는 panic이 일어난 것을 감지할 수 있는 기능도 제공합니다. use std::panic; fn main() { let result = panic::catch_unwind(|| -> i32 { println!("good"); "42".parse().unwrap() }); println!("{:?}", result); let result = panic::catch_unwind(|| -> i32 { println!("bad"); "AaaaaAAaaaAAAaaAAAAaAAAAA".parse().unwrap() }); println!("{:?}", res..
https://turbo.fish/ 터보피쉬는 물고기의 한 종류 Rust의 문법 중 하나입니다.C++로 따지면 템플릿 파라미터를 직접 지정하는 것과 비슷하다고 할 수 있습니다. let num = "42".parse();위 코드는 컴파일이 안됩니다.타입 추론에 필요한 정보가 부족하기 때문이죠.num의 타입을 추론하자니 parse의 반환형이 제너릭 타입이라 알 수 없고parse의 제너릭 타입을 추론하자니 num의 타입을 모르는 상황이죠.두 해결 방법이 있는데 그냥 num: i32 이렇게 num의 타입을 지정하는 것과parse에 turbofish 문법을 사용해서 해결할 수도 있습니다. let num: i32 = "42".parse(); let num = "42".parse::(); // turbofish사실 ..
#[macro_use] extern crate log; fn main() { debug!("hello, "); info!("world!"); }매크로가 다른 모듈에 있는 경우 macro_use 어트리뷰트를 써서 매크로를 임포트하라고 배웠었는데이제 꼭 필요한건 아니게 되었다고 하네요. extern crate log; use log::info; fn main() { log::debug!("hello, "); info!("world!"); }이렇게 매크로 외의 것들을 임포트 할 때처럼 할 수 있다고 합니다. 그나저나 Procedural Macro 기능이 정식으로 추가된 게 아주 마음에 드네요.C#처럼 어트리뷰트를 만들 수 있다! 얏호! 참고https://blog.rust-lang.org/2018/12/21/P..
fn main() { let num = u32::max_value(); println!("{}", num + 1); } 러스트는 런타임 연산 과정에서 오버/언더플로를 감지하여 패닉을 일으켜주는 기능이 있습니다.그래서 위 코드는 "thread 'main' panicked at 'attempt to add with overflow'"같은 에러를 뿜습니다.대부분은 도움이 되지만 가끔 일부러 오버/언더플로를 일으키는 경우도 있습니다.그럴 때 쓸 수 있는게 wrapping_* 메소드나 Wrapping입니다. fn main() { let num = u32::max_value(); println!("{}", num.wrapping_add(1)); }위 코드는 wrapping_add 메소드를 사용해서 패닉 없이 오버플..
코드 출처 : https://dtolnay.github.io/rust-quiz/7 #[repr(u8)] enum Enum { First, Second, } impl Enum { fn p(self) { match self { First => print!("1"), Second => print!("2"), } } } fn main() { Enum::p(unsafe { std::mem::transmute(1u8) }); }위 코드는 UB인가? 컴파일이 되는가? 된다면 출력은? (정답은 아래에) 정답은 UB가 아니고 컴파일 되며 출력은 1입니다.설명이야 위 링크에 잘 나와있지만 정리할겸 적어봅니다. 일단 `#[repr(u8)]` 덕분에 Enum::First == 0u8, Enum::Second == 1u8이 보..
출처 : https://doc.rust-lang.org/nomicon/lifetime-mismatch.html struct Foo; impl Foo { fn mutate_and_share(&mut self) -> &Self { &*self } fn share(&self) {} } fn main() { let mut foo = Foo; let loan: &Foo = foo.mutate_and_share(); foo.share(); }위 코드는 아래와 같은 에러를 뿜으며 컴파일이 안됩니다. error[E0502]: cannot borrow `foo` as immutable because it is also borrowed as mutable --> src/main.rs:11:5 | 10 | let loan:..
T object = { .designator = arg1 , .designator { arg2 } ... }; T object { .designator = arg1 , .designator { arg2 } ... }; #include using namespace std; struct Foo { int a, b; float c = 42.0f; }; int main() { cout
memory 헤더에 있는 이 함수들은 초기화 되지 않은 메모리에 관한 기능이 있습니다.초기화 되지 않았다는 것은 생성자가 호출되지 않았다는 것이죠.get_temporary_buffer는 메모리를 할당하며return_temporary_buffer는 메모리를 해제합니다.uninitialized_*는 초기화되지 않은 메모리에 대해 생성자를 호출하며 특정 알고리즘을 수행합니다. 예시를 봅시다. (C++17 이상에서만 컴파일 됨) #include #include #include class Foo { public: explicit Foo(int data) : data(data) { std::cout
티스토리 조회수 서버가 잘 동작하는지 보고 싶어서 로그를 봤는데 에러가 있었습니다. (그 와중에 robots.txt 접근이 있는 걸 보니 크롤러가 벌써...) 정확히 어디서 발생한 에러인지 모른다는게 흠이지만 (자체 로그의 중요성) 짐작가는 곳이 있어서 거길 고쳤습니다. 문제가 됬던 부분은 API 요청에 쓰는 객체가 여러 스레드에서 사용되면 안됬었고 이미 Rust가 컴파일 오류를 통해 그 사실을 알려줬었는데 제가 강제로 Send, Sync trait을 구현해서 컴파일이 되게 만들었던 것이었죠. (멍청) 이 바보 같은 짓은 깃헙 레포의 커밋 내역을 보시면 바로 알 수 있습니다... 그런데 참 신기한 우연이 있었습니다. 시간이 날 때마다 Rust 튜토리얼을 반복해서 보는데 마침 오늘 볼 파트가 Sync, S..