引っ越しn日前の部屋

この記事は whywaita Advent Calendar 2021 - Adventar の4日目の記事です 12/24だけどセーフ

f:id:Krouton:20211224200033p:plain
引っ越しn日前の部屋です

元々そこに鳴るについて書く予定だったのでこれがそれです

f:id:Krouton:20211224200206p:plain
そこに鳴るのライブTシャツとタオル

本当はもっと書きたいことはありますが最近聞いてる曲だけ貼ります

www.youtube.com

whywaitaはそろそろ俺とライブに行くべきじゃないか?なあ

ていうか光ってなんだよ

Rust: イテレータメソッドの by_ref() と take_while() の組み合わせには気をつけようという話(てかドキュメントを読もう)

事の発端

take_while というイテレータメソッドがある。 doc.rust-lang.org 詳しい説明は公式に任せるとして、 take_while した後の残りが欲しかったが take_whileself を取るので 一回使ったら再利用できない。by_ref を使ってrestを取ろうとした。が、take_whileイテレータが止まる条件を満たしたであろう最後に舐められた要素はdropされるという話でした。 例は下の playground で

play.rust-lang.org

まとめ

この記事書いてる時に

Because take_while() needs to look at the value in order to see if it should be included or not, consuming iterators will see that it is removed

の言及に気づいたのでドキュメントはちゃんと読みましょう

オチ

Option<Self> を返す trait を実装したかったがRustコンパイラ君が賢すぎただけの日記

trait OptionalConstructor {
    fn optional_new() -> Option<Self>;
    //                   ^^^^^^^^^^^^ doesn't have a size known at compile-time
    //                   Option<Self> where Self: Sized;
}
   Compiling playground v0.0.1 (/playground)
error[E0277]: the size for values of type `Self` cannot be known at compilation time
   --> src/main.rs:2:26
    |
2   |     fn optional_new() -> Option<Self>;
    |                          ^^^^^^^^^^^^ doesn't have a size known at compile-time
    |
help: consider further restricting `Self`
    |
2   |     fn optional_new() -> Option<Self> where Self: Sized;
    |                                       ^^^^^^^^^^^^^^^^^

記事にしようと思ったけどコンパイラ君が丁寧に書いてくれたので特に書くことなかった...、Self が lifetime parameterを取る場合もこのように書ける

trait OptionalConstructor {
    fn optional_new() -> Option<Self> where Self: Sized ;
}

struct S<'a> {
    s: &'a str
}

impl<'a> OptionalConstructor for S<'a>{
    fn optional_new() -> Option<Self> {
        None
    }
}

fn main() {}

ちなみに自分でOptionもどきを実装しても同じような事を言われる、Rustコンパイラ君賢すぎる...

Rust: Fully Qualified Syntax について簡単なメモ

2021/3/31 更新

高度なトレイト - The Rust Programming Language 日本語版

を知らなかった、これを読んでください

経緯

数時間前に「僕はチンパンジーだからでパーサコンビネータ使うの難しいな〜、LR(1)パーサを手書きするのが一番早いですよ〜」と同僚と会話をしていたid:Krouton です。フルスクラッチでやる縛りを設けてないので今回実装するパーサはパーサジェネレータを使おうかなと考えていました。チンパンジーだから分からん、と逃げていても一生進まないので nom の使い方を調べていたら友人のエントリにヒットして読んでたらFully Qualified Syntaxという知らない概念に出会いました。

drumato.hatenablog.com

該当エントリ内に書いてあるとおり公式を読めば*1終わりっちゃ終わりなのですが、ググって日本語の記事がないのも寂しいのでパーサのモチベが無くならない程度に書きます。

何が嬉しいのか

impl した trait のメソッド名が他の impl と被った時にどの trait のメソッドを呼び出すのか一意に定める事ができます。

続きを読む