2015-05-14 2 views
1
trait Trait<T> { 
    fn equality() -> bool; 
} 

impl<T> PartialEq for Trait<T> { 
    fn eq(&self, other: &Trait<T>) -> bool { 
     self.equality() 
    } 
} 

Результатов вРеализовать признак для признака со статической функцией

main.rs:5:23: 5:31 error: the trait `Trait` cannot be made into an object [E0372] 
main.rs:5 impl<T> PartialEq for Trait<T> { 

Удаления статического метода делает его компилируется. Методы с компиляцией самопараметров & тоже.

ответ

4

Это относится к вопросу, известному как объект безопасности, в котором вы можете найти информацию от RFC 255; У Хуона также есть a good explanation of object safety in his blog.

В принципе, для создания объекта-объекта требуется подразумеваемое определение признака для собственного объекта-объекта; в этом случае это будет impl<'a, T> Trait<T> for Trait<T> + 'a. Если можно написать содержательные определения всех методов, то признак является безопасным для объекта. Статические методы не имеют смысла в этом контексте - что бы мог быть тело fn equality() -> bool, без Self, чтобы вызвать метод equality? Это должно было бы вытащить булевое из воздуха, которое он почтительно отказывается делать.

0

Расширение ответа Криса, что вы, вероятно, хотите, это fn equality(&self) -> bool. fn equality() -> bool - статический метод, также известный как связанная функция. Он называется Trait::equality(), а не obj.equality() и не может получить доступ к полям и методам объекта, на который он вызван.

+1

Да, я уже это знал. Статический метод изначально назывался новым, поэтому требовалась статичность. – hpohl

Смежные вопросы