У меня есть следующее:
pub struct OpBStruct {
title: String,
output_vale: i32,
}
impl OpBStruct {
pub fn new_OpB(in_title: String, in_output_vale: i32) -> OpBStruct {
OpBStruct {
title: in_title,
output_vale: in_output_vale,
}
}
}
pub struct OpCStruct {
title: String,
another_value: String,
output_vale: i32,
}
impl OpCStruct {
pub fn new_OpC(in_title: String, in_another_value: String, in_output_vale: i32) -> OpCStruct {
OpCStruct {
title: in_title,
another_value: in_another_value,
output_vale: in_output_vale,
}
}
}
impl A {
pub fn new_A(in_name: String, in_operator: Op) -> A {
A {
name: in_name,
operator: in_operator,
}
}
}
pub enum Op {
OpB(OpBStruct),
OpC(OpCStruct),
}
pub struct A {
name: String,
operator: Op,
}
impl A {
pub fn new_A(in_name: String, in_operator: Op) -> A {
A {
name: in_name,
operator: in_operator,
}
}
}
Точная структура OpBStruct
и OpCStruct
произвольна и может быть чем угодно.
Как мне убедиться, OpBStruct
иOpCStruct
реализовать определенную черту?
trait OpTrait {
pub fn get_op_output(&self) -> i32;
}
Я думал о создании своего рода функции конструктора, которая проверяла бы требование черты OpTrait
, и это был бы единственный способ создать экземпляр Op
, но каждому оператору требуются разные параметры инициализации, и нет способа указать переменное число входов для функции в Rust.
Что-то подобное не работает, потому что нет способа ввода параметров инициализации:
pub fn new_op<T: OpTrait>(operator: T) {
// --snip--
}
Я думал о том, чтобы каким-то образом использовать метод new_A
, реализованный в A
, чтобы проверить, реализовал ли признак in_operator
, но я тоже не уверен, как это сделать.
Каков правильный шаблон для этого?Если их нет, я могу просто реализовать эту черту для каждого Op
без какого-либо интерфейса вокруг него.