私はRustには新しく、Boxを使用してVecに特定のTraitを実装する多くのタイプをプッシュできる人の例をいくつか見てきました。 GenericsでTraitを使用するとき、私は問題に遭遇しました。特色をVecタイプとして使用
error[E0038]: the trait `collision::collision_detection::Collidable` cannot be made into an object
--> src/collision/collision_detection.rs:19:5
|
19 | collidables: Vec<Box<Collidable<P, M>>>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `collision::collision_detection::Collidable` cannot be made into an object
|
= note: method `get_ncollide_shape` has generic type parameters
error: aborting due to previous error
error: Could not compile `game_proto`.
To learn more, run the command again with --verbose.
は、ここで私は私の衝突検出エンジンに供給するためのバックncollide互換性のある形状を与える不均一なゲームオブジェクトのリストとしてcollidablesを使用しようとしている私のコード
extern crate ncollide;
extern crate nalgebra as na;
use self::ncollide::shape::Shape;
use self::ncollide::math::Point;
use self::ncollide::math::Isometry;
use self::na::Isometry2;
pub trait Collidable<P: Point, M> {
fn get_ncollide_shape<T: Shape<P, M>>(&self) -> Box<T>;
fn get_isometry(&self) -> Isometry2<f64>;
}
pub struct CollisionRegistry<P, M>
where
P: Point,
M: Isometry<P>,
{
collidables: Vec<Box<Collidable<P, M>>>,
}
impl<P: Point, M: Isometry<P>> CollisionRegistry<P, M> {
pub fn new() -> Self {
let objs: Vec<Box<Collidable<P, M>>> = Vec::new();
CollisionRegistry { collidables: objs }
}
pub fn register<D>(&mut self, obj: Box<D>)
where
D: Collidable<P, M>,
{
self.collidables.push(obj);
}
}
です。
編集: 混乱を解消するには私は、Traitのインスタンスを構築して返そうとはしていません。私は、Vidを作成しようとしているだけです.Vecは、Collidable特性のインスタンスをその上にプッシュできるようにします。
可能な重複[トレイトは、自分自身を構築することができないのはなぜ?](https://stackoverflow.com/questions/38159771 /なぜ、形質ではないのか?それ自体はより良い重複があるかもしれないが、類似しているかもしれない。 – loganfsmyth
@loganfsmythこれは私がやろうとしていることではありません。私はこれに似たほとんどの例を読んだことがあり、Vec>を使って作業するようになっています。しかし、Vec >>のようなジェネリック型を持つ形質を使うと、突然このエラーが出ます。 –
'get_ncollide_shape'は何をすると思いますか?このエラーは、 'Box> 'は本質的に、それが特性を実装することを除いてオブジェクトに関するすべてのデータを消去したことを意味します。このコンテキストでは、 'fn get_ncollide_shape >(&self) - > Box ;はそれを呼び出す方法がないので意味がありません。 'T'でパラメトリックであるため、関数のバージョンは無限であるため、実行時にどのバージョンの関数を呼び出すかを知る必要があり、オプションも知られているので、その関数を使う方法はありません。 –
loganfsmyth