목록rust (50)
NeuroWhAI의 잡블로그
코드 출처 : 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:..
티스토리 조회수 서버가 잘 동작하는지 보고 싶어서 로그를 봤는데 에러가 있었습니다. (그 와중에 robots.txt 접근이 있는 걸 보니 크롤러가 벌써...) 정확히 어디서 발생한 에러인지 모른다는게 흠이지만 (자체 로그의 중요성) 짐작가는 곳이 있어서 거길 고쳤습니다. 문제가 됬던 부분은 API 요청에 쓰는 객체가 여러 스레드에서 사용되면 안됬었고 이미 Rust가 컴파일 오류를 통해 그 사실을 알려줬었는데 제가 강제로 Send, Sync trait을 구현해서 컴파일이 되게 만들었던 것이었죠. (멍청) 이 바보 같은 짓은 깃헙 레포의 커밋 내역을 보시면 바로 알 수 있습니다... 그런데 참 신기한 우연이 있었습니다. 시간이 날 때마다 Rust 튜토리얼을 반복해서 보는데 마침 오늘 볼 파트가 Sync, S..
서두 사실 바로 며칠 전부터 블로그 주인장은 통계를 볼 수 있게 되었습니다. 다만 2018년 1월 1일 이후의 데이터만 존재하고 방문자는 볼 수 없다는게 흠이죠. 소중한 방문자 분들의 시간을 낭비시키기 싫으니 미리 말씀드리는데 조회수 표시는 성공했으나 개인 서버와 도메인이 없거나 개발자가 아닌 사람들은 적용하기 힘든 방법입니다! 아래 사진은 결과물! 본문 아무튼 저는 제 글에 조회수가 작게 나타나면 보기 좋겠다 싶어서 검색을 해봤습니다. 그랬더니 이것저것 나오긴 하더라고요. 가장 마음에 들었던 방법은 구글 스프레시트를 DB이자 서버로 사용해서 표시하는 방법이었는데 저는 공부와 재미를 위해서 직접 개발하기로 하였습니다. 초기 계획은 Rust 언어와 Rocket이라는 웹 프레임워크로 서버를 개발하고 Hero..
이용한 라이브러리는 rocket, google-analytics3, yup-oauth2입니다.사실 제가 한거라곤 위 라이브러리들 공부한거랑 중간 캐시 로직을 만든 것 뿐이지만요 ㅋㅋ...보안도 없습니다. API는 아래처럼 생겼습니다. http://hostname/pv/{ids}/{page_id}(참고로 pv는 page view라는 뜻입니다 promotional video 아님)ids는 "ga:숫자들"형식의 애널리틱스 아이디이며page_id는 119, 112 등의 블로그에서의 글 주소이자 번호입니다.티스토리는 번호가 아니라 제목을 주소로 사용할 수도 있어서 그것도 되게끔 하긴 했는데 테스트는 안해봤습니다...이전 글에서는 자체 DB를 이용할 예정이라고 했는데 일단 구글 애널리틱스 자체를 DB로 쓰고 문제가..
참고 : https://stackoverflow.com/questions/52216426/access-to-external-crates-from-module extern crate adder; /* mod adder { pub fn add(a: i32, b: i32) -> i32 { a + b } } */ #[cfg(test)] mod tests { #[test] fn it_works() { assert_eq!(adder::add(2, 2), 4); } }대충 위 코드처럼 했는데 안되더라고요.분명 레퍼런스에서 읽었던 내용 같은데 까먹음 ㅎㅎ;; super::adder::add(2, 2)이렇게 바꾸면 되고 혹은 #[cfg(test)] mod tests { use adder::{self}; ... }이렇게 ..
C++로 비유하면 Rc는 shared_ptr, Weak는 weak_ptr입니다.다만 스레드 안전하지 않다는 점이 다릅니다.스레드 안전한 구현은 std::sync에 Arc, Weak라는 이름으로 있습니다. 아래는 cppreference의 weak_ptr::lock 예제 코드를 Rust버전으로 옮겨 본 예제 코드입니다. use std::rc::{Rc, Weak}; fn observe(w_ptr: &Weak) { if let Some(rc_ptr) = w_ptr.upgrade() { println!("\tobserve() able to upgrade Weak, value={}", *rc_ptr); } else { println!("\tobserve() unable to upgrade Weak"); } } fn..
#![feature(plugin)] #![plugin(rocket_codegen)] extern crate rocket; use std::path::{PathBuf, Path}; use rocket::response::{NamedFile}; #[get("/static/")] fn files(file: PathBuf) -> Option { NamedFile::open(Path::new("static/").join(file)).ok() } fn main() { rocket::ignite() .mount("/", routes![files]) .launch(); }끝....? (현재 경로)/static 폴더 아래에 위치한 파일이면 다 취득할 수 있습니당.꿀잼.
Rocket은 Rust의 웹 프레임워크입니다. 이 글에서는 Rocket을 이용해 접속시 Hello, world!를 응답하는 웹 서버를 만들고 Heroku에 올려 모든 사람이 볼 수 있도록 해보겠습니다. 결과 : https://hello-rocket.herokuapp.com 소스코드 : https://github.com/NeuroWhAI/hello-rocket (설명은 소스코드 링크에도 있으니 참고 바랍니다) 먼저 아래 명령어로 새로운 Rust 프로젝트를 만들겠습니다. cargo new hello-rocket --bin 앞으로의 모든 작업은 hello-rocket 폴더에서 이뤄집니다. 만약 프로젝트 이름을 바꾸셨다면 주의해서 명령어를 입력해주세요. Cargo.toml 파일을 열어 Rocket을 종속성에 추..
https://play.rust-lang.org/?gist=99e193ae58efd33a65408ef3aea41980&version=stable&mode=debug&edition=2015 fn main() { // exclusive range for x in 0..5 { print!("{} ", x); } println!(); // inclusive range for x in 0..=5 { print!("{} ", x); } println!(); /*for x in 0...5 { print!("{} ", x); } println!();*/ //error: `...` syntax cannot be used in expressions let x = 42; match x { 0...42 => println!(..