- 353 名前:デフォルトの名無しさん mailto:sage [2015/07/17(金) 13:44:39.09 ID:vkp5Zmx6.net]
- 型とクラスを混同しているようだけど、型とクラスは違う。その論文のどこにもトレイトは型じゃないと言ってない。むしろ型以外の何者でもない。
クラスベースのOOPLは型≒クラスだけど、rustにはクラスもその階層構造も無い。 その論文で言及している、inheritance由来のデメリットはrustには存在しない。 よってトレイトがクラスベースの言語で解決してくれるような問題はrustには無く、論文の定義通りのはたらき、 すなわち「requiredなメソッドを用意したらあるメソッドをprovideする」を行っている。 「本来の使い方」という曖昧な言い方はやめてくれ。 useで明示的に指定したメソッドしか使えないのは論文の定義(トレイトをミックスインした場合と、しないで同名のメソッドを定義したものは同等であるべき)とは違うように見えるが、 クラスが無いんだからあまり変わらない。むしろあるメソッドがどこから提供されているのかを曖昧にしないのは利点ですらある。 トレイトに関する多相性というと、トレイトをミックスインした型全てを扱える仕組み(fn do_foo<T:>(f: &T) where T: TFoo {...})と、 多相トレイトを定義できる仕組み(trait TFoo<V> { ... })の2つがあるが、後者があるのがどう問題になるのか? 多相トレイトを使う時、すなわちミックスイン時には単相化されるか、多相型のパラメータに渡されるだけなんじゃないの? そして多相トレイトをやめた場合、例えばIterator<Item=T>というものはどう実現すればいいのか。
|

|