😪

Rustで初学者がつまづいたところメモ

2023/12/16に公開

unwrap

https://zenn.dev/mebiusbox/books/22d4c1ed9b0003/viewer/bba4b4

impl<T, E> Result<T, E> {
    /// ```should_panic
    /// let x: Result<u32, &str> = Err("emergency failure");
    /// x.unwrap(); // panics with `emergency failure`
    /// ```
    #[inline]
    #[track_caller]
    #[stable(feature = "rust1", since = "1.0.0")]
    pub fn unwrap(self) -> T
    where
        E: fmt::Debug,
    {
        match self {
            Ok(t) => t,
            Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", &e),
        }
    }

prelude

https://doc.rust-lang.org/reference/names/preludes.html
importを一辺に行ってくれる仕組みらしい.

Arc: Atomically Reference Counted

https://qiita.com/qnighy/items/4bbbb20e71cf4ae527b9

Trait

RustのTraitは
mixinではない → 継承できる & 多重継承を単一継承に変換できないから
interfaceではない → メソッドに具体的な実装を持たせることができるから
https://opaupafz2.hatenablog.com/entry/2022/02/12/100250

derive macro

#[derive(Debug, Error, Clone, Copy)]
pub struct ValidatedRequest<T>(pub T);

https://doc.rust-jp.rs/rust-by-example-ja/trait/derive.html

型(或いは構造体)に対してTraitを実装する機能.
上記の例では、Debugトレイトに実装してあるメソッドが、ValidateRequest構造体にも実装される.

async-trait

https://blog-dry.com/entry/2020/06/19/193754#f-1a655cdc

RustはTraitのメソッドをasyncにできないので、それを解決するパッケージ(Trait).

#[async_trait]
impl<T, S, B> FromRequest<S, B> for ValidatedRequest<T>
where
    T: DeserializeOwned + Validate,
    S: Send + Sync,
    B: HttpBody + Send + 'static,
    B::Data: Send,
    B::Error: Into<BoxError>,
{

custom attribute macro

https://qiita.com/dalance/items/1911a775ee23f3e35d18
独自のattributeを定義することができる.

#[proc_macro_attribute]
pub fn async_trait(args: TokenStream, input: TokenStream) -> TokenStream {
    let args = parse_macro_input!(args as Args);
    let mut item = parse_macro_input!(input as Item);
    expand(&mut item, args.local);
    TokenStream::from(quote!(#item))
}

あとで読む
https://doc.rust-lang.org/reference/procedural-macros.html

impl<T> MyTrait for MyStruct<T>

https://zenn.dev/anchor_cable/articles/b073d510c6ff9ff7111e
ValidatedRequestという構造体にFromRequestトレイトを実装している.
ValidatedRequestはジェネリクスであり、実装の中でジェネリクスを使う必要があるので impl<T, S>と宣言している

#[async_trait]
impl<T, S> FromRequest<S> for ValidatedRequest<T>

.map(|x| x + 1)

https://zenn.dev/mebiusbox/books/22d4c1ed9b0003/viewer/64c6f3
https://doc.rust-jp.rs/book-ja/ch13-01-closures.html
クロージャ(無名関数)
関数の引数として渡すことのできる名前のない関数(無名関数)のこと
pythonで言うところのlambda x: x + 1

Discussion