1
Rust TraitsはGoインターフェイスとどう違うのですか?
私はGoに比較的精通しており、小さなプログラムをいくつか書いています。錆は、もちろん、あまり馴染みがありませんが、注視しています。 最近http://yager.io/programming/go.htmlを読んで、Genericsが処理される2つの方法を個人的に調べたいと思いました。エレガントに達成できませんでした。私は、Rustの特徴がいかに強力であるかについての誇大宣伝を聞き続けました。Goでいくつかの経験を積んで、それがどのように真実であり、最終的にどのような違いがあったのかと思いました。私が見つけたのは、特性とインターフェースがかなり似ているということです!最終的に、私は何かが欠けているかどうかわからないので、ここでそれらの類似点の簡単な教育的要約があります。 それでは、ドキュメントからGoインターフェイスを見てみましょう。 Goのインターフェイスは、オブジェクトの動作を指定する方法を提供します。これができる場合は、ここで使用できます。 最も一般的なインターフェイスはStringer、オブジェクトを表す文字列を返すことです。 type Stringer interface { String() string } そのため、そのString()上で定義されているStringerオブジェクトはすべてオブジェクトです。これfunc (s Stringer) print()は、ほとんどすべてのオブジェクトを取得して印刷するようなタイプシグネチャで使用できます。 またinterface{}、いずれのオブジェクトも受け取ります。その後、実行時にリフレクションを介してタイプを決定する必要があります。 それでは、ドキュメントからRust Traitsを見てみましょう: 最も単純な場合、特性はゼロ個以上のメソッドシグネチャのセットです。たとえば、単一のメソッドシグネチャを使用して、コンソールに出力できるものに対して特性Printableを宣言できます。 trait Printable { fn print(&self); } これは、すぐにGoインターフェースに非常によく似ています。私が見る唯一の違いは、単にメソッドを定義するのではなく、特性の「実装」を定義することです。だから、私たちはやる impl Printable for int { fn print(&self) { println!("{}", *self) } } の代わりに fn print(a: int) { ... } ボーナス質問:特性を実装するが使用しない関数を定義すると、Rustで何が起こりますimplか?うまくいきませんか? Goのインターフェイスとは異なり、Rustの型システムには型パラメーターがありinterface{}、コンパイラーとランタイムが実際に型を認識している間、適切なジェネリックなどを実行できます。例えば、 trait Seq<T> …