Черты должны быть реализованы конкретным типом и не должны определять константу самостоятельно, которая не может быть изменена в разработчиках. То, что вы указали, является значением по умолчанию, а не значением, которого должны придерживаться все разработчики. Вам не нужна черта, если все типы должны иметь одинаковое значение X
.
Следовательно, A::X
не является четко определенным значением.
Вот пример, показывающий, почему:
trait A {
const X: i32 = 1;
}
struct S;
impl A for S {}
struct R;
impl A for R {
const X: i32 = 42;
}
fn main() {
println!("S: {}", S::X);
println!("R: {}", R::X);
println!("S: {}", <S as A>::X); // A::X alone is ambiguous
println!("R: {}", <R as A>::X);
}
(ссылка на игровую площадку)
То, что вы делаете, похоже на попытку вызова функции по умолчанию для признака, здесь ошибка E0283:
trait A {
fn get_x() -> i32 {
1
}
}
struct S;
impl A for S {}
struct R;
impl A for R {
fn get_x() -> i32 {
42
}
}
fn main() {
// A::get_x() is ambiguous but there are not:
println!("S: {}", S::get_x());
println!("R: {}", R::get_x());
println!("S: {}", <S as A>::get_x());
println!("R: {}", <R as A>::get_x());
}
(ссылка на игровую площадку)