62614


[num](https://crates.io/crates/num) を使用していて、`BigRational` などは `Copy`
を実装していないため、

[code]

    let a: &BigRational;
    let b: BigRational;
    // ...
    let c = a + b;
    
[/code]

のようなことが出来ないことに気づきました。  
`clone` がヘビーな可能性があるため `Copy` を実装していない、と言うのはわかるのですが、いちいち

[code]

    let c = a + &b;
    let d = &(a + a) + a
    
[/code]

とするのは数式が複雑だと面倒です。

タイトルにあるように

[code]

    impl Add<&BigRational> for BigRational
    impl Add<BigRational> for &BigRational
    
[/code]

を実装していれば自然に記述できるし、num の型がどうかはわかりませんがコピーを減らせる可能性もあります。  
にもかかわらず num で実装されていないのは何か理由があるのでしょうか。


CC BY-SA 4.0
2020-01-28T13:43:49.800
62611
2020-01-28T15:07:55.673
20885
question
rust
impl Add<&MyType> for MyType はアンチパターン？

[code]

    use num::*;
    fn test(a: &BigRational, b: BigRational) {
        let _c = a + b;
    }
    
[/code]

[https://play.rust-
lang.org/?version=stable&mode=debug&edition=2018&gist=abad30b3a3c21ea293716ff4a3b6211a](https://play.rust-
lang.org/?version=stable&mode=debug&edition=2018&gist=abad30b3a3c21ea293716ff4a3b6211a)

これは問題なくコンパイルでき、また num 0.2.1 のリファレンスにも `impl<'a, T> Add<&'a Ratio<T>> for
Ratio<T>`は存在しているように見えます。  
<https://docs.rs/num/0.2.1/num/rational/struct.Ratio.html#implementations>

上記の通り多くのcrateで `impl Add<&MyType> for MyType`
は実装されており特にアンチパターンという事は無いと思います。例えばN次元配列 `ndarray::ArrayBase` なども実装しています：  
<https://docs.rs/ndarray/0.13.0/ndarray/struct.ArrayBase.html#implementations>


CC BY-SA 4.0
2020-01-28T15:07:55.673
62614
2020-01-28T15:07:55.673
9572
62611
answer