Вот допустим у меня есть примерно такой Java-код:
public enum SegmentType {
CLOSE, MOVE_TO, LINE_TO, SPLINE_TO
}
public interface Segment {
SegmentType getType();
Object[] getParams();
}
public final class MoveSegment implements Segment{
private Integer[] point = new Integer[2];
public MoveSegment( int x, int y ){
point[0] = x;
point[1] = y;
}
public SegmentType getType(){
return MOVETO;
}
public Object[] getParams(){
return point;
}
}
public final class CloseSegment implements Segment{
public SegmentType getType(){
return CLOSE;
}
public Object[] getParams(){
return null;
}
}
public interface Shape extends Iterable<Shape>{
}
void travel( Shape shape ){
for( Segment segment: shape ){
switch( segment.getType() ){
case MOVETO: break;
case CLOSE: break;
}
}
}
Как подобное лучше реализовать на Rust’е?
Если с Segment’ом вполне понятно:
pub enum Segment<T> {
Close,
MoveTo( T, T ),
}
То как по хорошему должен выглядить Shape?
ПОнятно, что самый простой способ:
pub trait Shape<T> {
fn get_path(&self) -> Vec<Segment<T>>;
}
Но не будет ли там слишком много копирования данных?
Хотелось бы итерировать по ссылкам.