목록rust (50)
NeuroWhAI의 잡블로그
use std::io::{self, Read}; mod bf { use std::io::{self, Read}; #[derive(Default)] pub struct Machine { code: Vec, ram: Vec, head: usize, ptr: usize, } impl Machine { pub fn new() -> Self { Machine::default() } } impl Machine { pub fn initialize(&mut self, ram_size: usize) { self.ram.resize(ram_size, 0); } pub fn mount(&mut self, code: &str) { self.code = code.chars().collect(); } pub fn step(&mu..
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..
if self.cache.contains_key(ids) { let sub_cache = self.cache.get_mut(ids).unwrap(); if sub_cache.contains_key(page_id) { let data = sub_cache.get_mut(page_id).unwrap(); data.update(cnt); } else { // 캐시가 비정상적으로 커질 가능성 배제. if sub_cache.len() >= self.max_sub_cache_len { sub_cache.clear(); } sub_cache.insert(page_id.clone(), CacheData::new(cnt)); } } else { let mut sub_cache = HashMap::new(); sub_ca..
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사실 ..
릴리즈 노트(190105) 예시 바로 어제 추가되었네요! (감격)(감사) 이제 자동 완성도 넣어주ㅅ....
데코레이터 패턴으로 HTML 코드를 표현한 예제입니다. https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b0fb18d31a6e4da32f135a3970985efc trait Element { fn outer_html(&self) -> String; } struct Content { content: String } impl Content { fn new(content: &str) -> Content { Content { content: content.into() } } } impl Element for Content { fn outer_html(&self) -> String { self.content.clone() } } st..
https://merry-christmas-wasm.herokuapp.com 확증은 없는데 경험적으로 보자면 원인은 잊혀진(?) 메모리의 재사용 때문이 아닐까 싶습니다.문제가 되는 시나리오는 아래와 같습니다.일단 캔버스에 쓸 메모리를 Rust에서 할당하고 forget합니다.눈을 계속 만들면서 Vec가 내부적으로 공간 확보를 위해 재할당을 수행하는데 이때 forget했던 메모리 부분을 침범합니다.캔버스 이미지가 제대로 나오지 않게 됩니다!그래서 임시로 눈을 담고 있는 Vec의 재할당이 일어나지 않게 하고 캔버스에 쓸 메모리를 할당하기 전에 초기 눈 생성을 수행했더니 제대로 동작을 했습니다.이것을 토대로 어차피 할당하는 메모리는 캔버스에 쓸 이미지 메모리 뿐이니 전용 static Vec을 만들고 forget..
#[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..
https://merry-christmas-wasm.herokuapp.com위 링크로 들어가시면 됩니다.그저 눈이 내리는 페이지... 무슨 문제인지 모르겠는데 가끔 안됩니다 ㅠㅠ창 크기를 조정하면 될 수도 있어요. 핵심 부분은 Rust로 작성했습니다.웹은 잘 모르기도 하고 삽질을 많이 했네요 ㅠ 소스코드도 GitHub에 올려두었습니다.https://github.com/NeuroWhAI/merry-christmas-wasm 늦었지만 모두 메리 크리스마스!
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 메소드를 사용해서 패닉 없이 오버플..