Я программист C ++, изучающий Rust, и один из моих основных вариантов использования - это механизм вычислений на основе графов. В моем графе я храню однородный тип, а затем я получаю из него более конкретный тип c, например, в C ++
class BaseNode {
public:
BaseNode(std::vector<std::shared_ptr<BaseNode>>& parents);
virtual ~BaseNode() = default;
virtual void update();
const std::vector<std::shared_ptr<BaseNode>>& parents() const;
...
};
template<typename T>
class TypedNode<T> : public BaseNode {
public:
const T& value() const { return value_; }
...
private:
T value_;
}
Идея состоит в том, что граф пересекается и вызывается update()
на каждом узле. Узел знает, что такое каждый из его «истинных типов» своих родителей, и поэтому в update()
может сделать что-то вроде static_cast<TypedNode<DataBlob>>(parents()[0])
.
Как мне добиться чего-то подобного в Rust?
Я думал о дизайне, подобном этому:
trait BaseNode {
fn parents(&self) -> &Vec<dyn BaseNode>;
}
trait TypedNode<T>: BaseNode {
fn value(&self) -> &T;
}
Но я читал, что не смогу преобразовать «объект черты» из BaseNode
в TypedNode<T>
. (Или я могу сделать это как-нибудь, используя unsafe
?). Другая альтернатива, о которой я подумал, - иметь структуру, которая хранит данные в Any
, а затем преобразовать их, но стоит ли это некоторых затрат времени выполнения?