我有一個帶有很多型別引數的通用結構:
struct J<A, B, C, D, E, F, G>{...}
以及使用這些引數子集的其他結構:
struct H<A, B, C>{...}
struct I<C, D, E, F, G>{...}
我正在撰寫J經常使用H或I具有相同型別引數的方法:
impl<A, B, C, D, E, F,G> J<A, B, C, D, E, F,G> {
fn f_1() -> I<C, D, E, F, G> {...}
fn f_2() -> H<A, B, C> {...}
}
現在重寫型別引數這么多是非常麻煩的,所以只有能夠做這樣的事情才有意義:
impl<A, B, C, D, E, F,G> J<A, B, C, D, E, F,G> {
type MyI = I<C, D, E, F, G>;
type MyH = H<A, B, C>;
fn f_1() -> MyI {...}
fn f_2() -> MyH {...}
}
就像您可以在特征中使用關聯型別一樣。盡管 Rust 編譯器對此感到滿意,但我還沒有找到任何表達方式。上述錯誤與:
error[E0658]: inherent associated types are unstable
--> src/lib.rs:14:5
|
14 | type MyI = I<C, D, E, F, G>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
error[E0658]: inherent associated types are unstable
--> src/lib.rs:15:5
|
15 | type MyH = H<A, B, C>;
| ^^^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
error[E0223]: ambiguous associated type
--> src/lib.rs:17:17
|
17 | fn f_1() -> Self::MyI {
| ^^^^^^^^^ help: use fully-qualified syntax: `<J<A, B, C, D, E, F, G> as Trait>::MyI`
error[E0223]: ambiguous associated type
--> src/lib.rs:20:17
|
20 | fn f_2() -> Self::MyH {
| ^^^^^^^^^ help: use fully-qualified syntax: `<J<A, B, C, D, E, F, G> as Trait>::MyH`
真的沒有辦法嗎?
uj5u.com熱心網友回復:
正如編譯器錯誤所暗示的,目前不支持此功能。跟蹤問題是https://github.com/rust-lang/rust/issues/8995。
作為一種解決方法,您可以定義一個由它MyTypes實作的J具有必要關聯型別的單獨特征。但是,訪問它們的語法 ( <Self as MyTypes>::MyI) 并沒有那么冗長。這種方法的一個優點是,如果您需要更改MyI,您只需在一個地方進行。
trait MyTypes {
type MyI;
type MyH;
}
impl<A, B, C, D, E, F, G> MyTypes for J<A, B, C, D, E, F, G> {
type MyI = I<C, D, E, F, G>;
type MyH = H<A, B, C>;
}
impl<A, B, C, D, E, F, G> J<A, B, C, D, E, F, G> {
fn f_1() -> <Self as MyTypes>::MyI { todo!() }
fn f_2() -> <Self as MyTypes>::MyH { todo!() }
}
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/511342.html
標籤:仿制药锈性状
上一篇:F#泛型型別限制為特定型別?
下一篇:如何使用基本控制器設定T
