特定函数的特征约束而不是整个实现

时间:2014-12-12 17:36:03

标签: rust traits generic-function

我试图实现一个可以接受任何类型参数的通用结构。

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类型有关,它只返回字符串&#34; WELCOME&#34;

我如何重写实现,以便只能通过Position<Num>调用add方法,并且可以通过任何其他通用实现调用display。

1 个答案:

答案 0 :(得分:2)

你应该创建单独的实现,一个是绑定的,另一个没有,像这样:

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()
    }
}

您可以看到它有效here