あけましておめでとうございます、25年間住んだ神奈川を離れて京都に引っ越しました。
続きを読む引っ越しn日前の部屋
この記事は whywaita Advent Calendar 2021 - Adventar の4日目の記事です 12/24だけどセーフ
元々そこに鳴るについて書く予定だったのでこれがそれです
本当はもっと書きたいことはありますが最近聞いてる曲だけ貼ります
whywaitaはそろそろ俺とライブに行くべきじゃないか?なあ
Rust: イテレータメソッドの by_ref() と take_while() の組み合わせには気をつけようという話(てかドキュメントを読もう)
事の発端
take_while
というイテレータメソッドがある。
doc.rust-lang.org
詳しい説明は公式に任せるとして、 take_while
した後の残りが欲しかったが take_while
は self
を取るので 一回使ったら再利用できない。by_ref
を使ってrest
を取ろうとした。が、take_while
でイテレータが止まる条件を満たしたであろう最後に舐められた要素はdropされるという話でした。
例は下の playground で
まとめ
この記事書いてる時に
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
の言及に気づいたのでドキュメントはちゃんと読みましょう
オチ
Rustで最高のIteratorといえば? => by_ref()
— 刃物休暇 (@Krout0n) 2021年6月22日
これ嘘ほんま許さん
— 刃物休暇 (@Krout0n) 2021年6月22日
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という知らない概念に出会いました。
該当エントリ内に書いてあるとおり公式を読めば*1終わりっちゃ終わりなのですが、ググって日本語の記事がないのも寂しいのでパーサのモチベが無くならない程度に書きます。
何が嬉しいのか
impl した trait のメソッド名が他の impl と被った時にどの trait のメソッドを呼び出すのか一意に定める事ができます。
続きを読む