VOICEVOX / voicevox_core

無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXのコア
https://voicevox.hiroshiba.jp/
MIT License
872 stars 116 forks source link

fix: `IndexMap::`{`remove`→`shift_remove`} #846

Closed qryxip closed 1 month ago

qryxip commented 1 month ago

内容

indexmapを新しいバージョンに上げると以下の警告が出るため、その対応です。 (このPRではindexmapのバージョンはそのままにして、アップデートはRenovateに任せます)

warning: use of deprecated method `indexmap::IndexMap::<K, V, S>::remove`: `remove` disrupts the map order -- use `swap_remove` or `shift_remove` for explicit behavior.
   --> crates/voicevox_core/src/status.rs:274:19
    |
274 |         if self.0.remove(&model_id).is_none() {
    |                   ^^^^^^
    |
    = note: `#[warn(deprecated)]` on by default

warning: use of deprecated method `indexmap::IndexMap::<K, V, S>::remove`: `remove` disrupts the map order -- use `swap_remove` or `shift_remove` for explicit behavior.
  --> crates/voicevox_core/src/user_dict/dict.rs:64:56
   |
64 |         let Some(word) = self.with_words(|words| words.remove(&word_uuid)) else {
   |                                                        ^^^^^^

現在使っているindexmap v2.0.0の時点でremoveswap_removeshift_removeの三つは存在しており、removeswap_removeのエイリアスです。v2.1.0からremove#[deprecated]になって上記の警告が出るようになったようです。

swap_removeshift_removeの違いは何なのかと言うと、[a, b, c, d, e]のようなキーの並びからswap_removebを抜き取ると[a, e, c, d]のような並びになります。shift_removeはPythonのdict.__delitem__のような一般的な挙動です。

UserDict::remove_wordとかのパブリックAPIの挙動にも関わってくるため、一般的な挙動の方がよいかと思いswap_removeではなくshift_removeの方にしました。これが本PRのcommit prefixを"improve:"にしている理由です。 ("fix:"にしようか迷ったのですが、ドキュメント上で順序の保証はしてなかったかなと思ったので"improve:"にしてしまいました) [追記] いや書いてた!!ということで、"fix:"にしました。

関連 Issue

841

その他