1

我正在尝试实现一个可以采用任何类型参数的通用结构。

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 可以由任何其他通用实现调用。

4

1 回答 1

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

你可以看到它在这里工作。

于 2014-12-12T19:15:06.407 回答