2015-10-27 7 views
7

私はGrid構造体をpiston-2dgraphicsライブラリから拡張しようとしています。特定のセルのウィンドウ上に位置を取得する方法はないので、私はそれを計算するための特性を実装しました。次に、グリッド上の特定のセルの近傍を計算するメソッドが必要なので、別の特性を実装しました。構造体を拡張するための特性以外の方法はありますか?

何かこれは醜いものであり、この特定のグリッド構造以外のものに対してこれらの特性を決して使用しない可能性が高いと思われます。だから、毎回特性を実装することなく構造体を拡張するRustの別の方法がありますか?

+2

AFAIK、no。あなたはすべての方法で一つの形質を実装することができます。 – Shepmaster

答えて

9

Rust 1.3以降、他の方法はありません。

別の枠で定義されている型に固有のメソッドを定義することはできません。しかし、あなたが知っているように、必要なメソッドで独自の特性を定義し、その特性を外部型に実装することができます。このパターンは、拡張特性として知られています。延長形質の名称は、慣習的には、Extで終わり、この形質はジェネリックバインドまたは形質オブジェクトとして使用されないことを示す。 There are a few examples in the standard library.

他のライブラリでも、拡張機能をエクスポートできます(例:byteorder)。しかし、他の形質に関しては、形質の方法をuse SomethingExt;とする必要があります。

+0

素晴らしい、説明のおかげで。私はエクステンションの特質について全く知らなかった。おそらく私はそれを[book](https://doc.rust-lang.org/book/traits.html)に追加することを提案することができます。これは私が無駄にチェックした最初の場所です。 – tsujin

4

現在のところ、別のクレートで定義されているタイプの新しいメソッドを記述する唯一の方法は、特性を使用する方法です。しかし、これは、特性定義と実装の両方を書く必要があるため、あまりにも面倒です。

私の意見では、方法の代わりに自由な関数を使うことです。これは少なくとも、形質によって引き起こされる重複を避けるだろう。

関連する問題