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

Я пытаюсь реализовать универсальную структуру, которая может принимать любой параметр типа.

struct Position<T>{
    x: T,
    y: T,
}

impl<T:Num> Position<T>{
    fn add(&self, other: &Position<T>) -> Box<Position<T>>{
        box Position{x:self.x + other.x, y:self.y + other.y}
    }

    fn display(&self) -> String{
        "WELCOME ".to_string()
    }
}

теперь я могу определить

let original_position = Position::<int>{x: 2, y:23};
let another_postion   = original_position.add(&original_position);
let welcome           = original_postion.display();

без ошибок

Точно так же я могу сделать следующее без каких-либо ошибок.

let string_position = Position::<String>{x: "x_pos".to_string(), y: "y_pos".to_string()};

теперь из-за ограничения признака Num я не могу назвать следующее (что очевидно).

string_position.add(&original_position);

но моя проблема в том, что теперь я не могу вызвать следующее из-за того же ограничения черты Num

string_position.display()

указанная выше функция имеет отношение к типу Num, она просто возвращает строку "WELCOME"

как мне переписать реализацию, чтобы метод add мог вызываться только Position<Num>, а display мог вызываться любой другой универсальной реализацией.


person basic_bgnr    schedule 12.12.2014    source источник


Ответы (1)


Вы должны создать отдельные реализации, одну с привязкой, а другую без, например:

impl<T:Num> Position<T>{
    fn add(&self, other: &Position<T>) -> Box<Position<T>>{
        box Position{x:self.x + other.x, y:self.y + other.y}
    }
}

impl<T> Position<T>{
    fn display(&self) -> String{
        "WELCOME ".to_string()
    }
}

Вы можете увидеть, что это работает здесь.

person Jorge Israel Peña    schedule 12.12.2014