許容される破壊的変更: 任意の固有アイテムの追加
通常は実装に固有のアイテムを追加するのは安全である。なぜなら固有のアイテムはトレイトのアイテムより優先される。ただし、もし実装されたトレイトのアイテムと同じ名前で異なるシグネチャなら、特定の場合では衝突して問題の原因になるかもしれない。
// Breaking change example /////////////////////////////////////////////////////////// // Before pub struct Foo; /////////////////////////////////////////////////////////// // After pub struct Foo; impl Foo { pub fn foo(&self) {} } /////////////////////////////////////////////////////////// // Example usage that will break. use updated_crate::Foo; trait Trait { fn foo(&self, x: i32) {} } impl Trait for Foo {} fn main() { let x = Foo; x.foo(1); // Error: this method takes 0 arguments but 1 argument was supplied }
注意すべきはシグネチャが一致する場合で、これはコンパイル時のエラーにはならないだろう、だが実行時の挙動のこっそりとした変更になりうる (なぜならそれはもう異なる関数を実行している)。
マイグレーション戦略:
- プロジェクトによってはこれを容認可能な破壊として捉えるだろう、特に新しいアイテムの名前が既存コードと衝突しなさそうなら。こうした衝突を避けるために名前は慎重に選べ。さらに、依存性の更新時に正しい関数を選択するために利用者側に曖昧でない構文の追加を要請するのも容認可能かもしれない。