2016-11-01 5 views
2

私のクラスノートにはHasAreaの特性を実装するコードがあり、この領域は錆びの本の例に似ています。Rustジェネリック関数では、いつTまたは&Tとして入力を受け取りますか?

trait HasArea<T> { 
    fn area(& self) -> T, 
} 

fn print<T: Display, S: HasArea<T>>(s: &S) { 
    println!("", s.area()); // println sth must impl Display trait 
} 

struct Circle { 
    x: T, 
    y: T, 
    r: T, 
} 

impl <T: Copy + Mul <Output = T>> 
    HasArea<T> for Circle<T> 
{ 
    fn area(&self) -> T { 
     self.r * self.r 
    } 
} 

入力としてshape: Tを使用し錆帳、にそれを比較:教授のノートには、以下の通りである教授がs: &Sを使用する理由錆ブックがshape: Tを使用しながら、

trait HasArea { 
    fn area(&self) -> f64; 
} 

struct Circle { 
    x: f64, 
    y: f64, 
    radius: f64, 
} 

impl HasArea for Circle { 
    fn area(&self) -> f64 { 
     std::f64::consts::PI * (self.radius * self.radius) 
    } 
} 

fn print_area<T: HasArea>(shape: T) { 
    println!("This shape has an area of {}", shape.area()); 
} 

fn main() { 
    let c = Circle { 
     x: 0.0f64, 
     y: 0.0f64, 
     radius: 1.0f64, 
    }; 

    print_area(c); 
} 

私は、わかりません。一般的な関数を実装するときは誰でも助けてくれますか?x: &Tと入力すると、いつx: T

+5

無関係ですが、私は興味があります:どの大学ですか?私はあなたが答えた後、このコメントを削除します;-) –

+0

UC-Davisの学部CSクラスに問題はありません。 – enaJ

答えて

5

Can anyone help compare when implementing a generic function, when do we pass a input as x: &T and when x: T ?

それはあなたがx: Foox: &Fooを受け入れるときと同じです。 x: Fooを指定すると、所有者の所有権はxになります(xCopy以外の場合)。発信者は再びその機能を使用できなくなります。

錆ブックの例では、print_areacircleの所有権を取得しますので、あなたはprint_area(circle);行の後circleを使用することはできません。たとえば、次のよう

fn main() { 
    // ... 
    print_area(c); 
    print_area(c); 
} 

は、このエラーがスローされます。

error[E0382]: use of moved value: `c` 
    --> <anon>:29:16 
    | 
28 |  print_area(c); 
    |    - value moved here 
29 |  print_area(c); 
    |    ^value used here after move 
    | 
    = note: move occurs because `c` has type `Circle`, which does not implement the `Copy` trait 

を私の経験では、ほとんどの時間は、あなたは(あなたの教授のノートのような): &Tを取るしたいと思います。構造体の所有権が必要な場合にのみ: Tを使用する必要があります。簡単にするために、錆ブックはおそらく: Tを使用します。

+0

私はあなたが '&T' *を取ることを望んでいる時にはほとんど反対します。特性が[その型のアイテムへのすべての参照に対して実装されている]場合は、* more * indirectionを追加する理由はありません(http://stackoverflow.com/q/28799372/155423)。 – Shepmaster

+0

@Shepmaster良い点(私は 'Copy'と一緒に言いたかったが、忘れてしまった)。しかし、やはり 'T 'に比べて'&T'には多くのインプラントが見られませんでした。その地域を印刷するだけの、錆びた本の例題「T」をどう思いますか? – Dogbert

1

これは、ジェネリックスの問題ではなく、借用と所有権の問題です。入力を関数に移動させたい場合はTを使用します。それ以外の場合は、借用したい場合は&Tまたは&mut Tを使用します。

Relevant book section

関連する問題