Это должно работы:
impl<T> Stack<T> for Vec<T> {
fn top(&self) -> Option<T> {
match self.len() {
0 => None,
n => Some(self[n-1])
}
}
}
Необходимо сообщить компилятору о параметрах типа Stack
, имеющих отношение к реализации.
Но этого не достаточно: устранить эту ошибку, вызывает проблемы с функцией main
, в частности, параметр println!
имеет неправильный тип:
fn main() {
let mut stack: Vec<f64> = Vec::new();
stack.push(42.0);
match stack.pop() {
None => println!("empty stack"),
Some(n) => println!("top: {}", n)
};
}
Но это исправление, в свою очередь, показывает, что top
метод не очень хорошо напечатан для этого кода. Один из способов исправить ошибку:
trait Stack<T> {
fn top(&self) -> Option<&T>;
}
impl<T> Stack<T> for Vec<T> {
fn top(&self) -> Option<&T> {
match self.len() {
0 => None,
n => Some(&self[n-1])
}
}
}
Edit:
, как объяснено @sellibitze в комментариях, почему он не работает является то, что из первоначального определения Stack
, компилятор не могли знать, что значения типа T
могут быть скопированы или хотя бы клонированы - т.е. что T
поддерживает символ Copy
или Clone
, и, следовательно, значения не могут быть дублированы (возврат по значению на языке C++). Использование ссылки решает проблему, как ссылка на T
является копируемыми
, а не подогнанным на возвращаемое значение из top
, я мог бы использовать тот факт, что Option<T>
поддерживает Show
черту, когда T
реализует его, что происходит, чтобы быть правдой для f64
. Это означает, что я мог бы просто заменить {}
форматом {:?}
в вызове макроса println!
и оставить остальную часть оригинальной функции main
без изменений.
Например:
fn main(){
let mut stack: Vec<f64> = Vec::new();
stack.push(42.0);
println!("top: {:?}", stack.top())
}
Там же метод, как .TOP уже, называется '.last()', что вы можешь использовать. – bluss
Пожалуйста, не забудьте добавить полезные ответы и пометить ответ как принятый, если он решит вашу проблему! Если ответ не является приемлемым, подумайте о том, чтобы оставить комментарии, объясняющие, почему, или отредактируйте свой вопрос, чтобы сформулировать проблему по-разному. – Shepmaster