AsChar in winnow::stream - Rust
https://docs.rs/winnow/latest/winnow/stream/trait.AsChar.html
うげ、 AsChar って Copy を含意してないのか
適切な使い方をすれば必要ないか? まあ確かに Stream 自体が Clone 可能だしどうとでもなるにはなるのか
one_of in winnow::bytes - Rust
https://docs.rs/winnow/latest/winnow/bytes/fn.one_of.html
> <I as Stream>::Token: Copy,
あっ……はーい。
Token が Copy でない実用的な状況って何だ……? となったけど、たとえばソースのパスやソース内の位置とか編集履歴とかがトークン単位で紐付いていて Arc<Metadata> みたいな形で参照を持っているような場合だと、 Cloneable ではあるが Copyable ではない感じになるな。納得。
にしても、そうなると余計な trait bound を避けるためには単一文字のマッチに winnow::bytes::one_of 使うのは避けるべきという気がしてきたな。
any.verify とかでもいいのか。考えてみよう
あーはいはいはい、 verify が G: Fn(&O2) -> bool を要求していて &O2 が &<I as Stream>::Token になるから、ここで AsChar::as_char(self) を持ってくるのに dereference からの implicit copy が挟まるんやな
じゃあ次の疑問は、なぜ
impl<'a, T> AsChar for &'a T where T: AsChar { ... }
という blanket impl がないのか、ということだな
Why `AsChar` does not have blanket impl? · winnow-rs/winnow · Discussion #232
https://github.com/winnow-rs/winnow/discussions/232
ソース漁ってもコメントとかなかったし blame は reformat とかモジュール移動とかで追い掛けるのクソ面倒そうだったので、素直に直接聞くことにした
……てことは何だ、もしかしてこれ blanket impl が入るまでは任意の &T (where T: AsChar) から char を得る手段がなくて Copy bound は必須ってこと!?
yak shaving のお時間がやってまいりました……
む り で し た
I::Token: Copy なぁ……
理屈のうえでは AsChar::as_char はトークンを消費も変更もしないのだから &self であるべきで、 char とか u8 みたいな一部のプリミティブ型で self を取ることがあるのは、単にトレイトでなく concrete type の inherent method であって Copy は確定しているからという文脈依存の最適化にすぎない
現状の実装だと気持ち悪いのでワイがプルリコ書いてもええかなという気持ちは若干あるんだが、残念なことにこれから1週間はクソ忙しくてそんな余裕がない……
とりあえずメンテナの考えを待つしかないか
余裕がないとか言いながら結局パッチ書いてしまったわ
もう3時間しか眠れません、あーあ
労役はクソ