>
enum 사용   Axes   Coordinate 를 제한  그리고 Quaternion :

#[derive(Clone)]
pub enum Axes {
    Coordinate {x: f64, y: f64, z: f64, reserve: Vec<f64>,},
    Quaternion {x: f64, y: f64, z: f64},
}
impl Axes {
    pub fn shift(&mut self, Sample: &Axes) -> () {
        let Dup: Axes = self.clone();
        match Dup {
            Axes::Coordinate {x, y, z, reserve} => {
                match &Sample {
                    Axes::Coordinate {x, y, z, reserve} => {
                        *self = Axes::Coordinate {x: *x, y: *y, z: *z, reserve: reserve.to_vec()};
                    }
                    _ => panic!(),
                }
            }
            Axes::Quaternion {x, y, z} => {
                match &Sample {
                    Axes::Quaternion {x, y, z} => {
                        *self = Axes::Quaternion {x: *x, y: *y, z: *z};
                    }
                    _ => panic!(),
                }
            }
        }
    }
}

특성 Axes 사용   struct 를 연결하려면   Coordinate  그리고 Quaternion :

pub trait Axes {
    fn shift(&mut self, Sample: &Axes) -> ();
    fn fold(&mut self, Sample: &Axes) -> ();
}
pub struct Coordinate {
    pub x: f64,
    pub y: f64,
    pub z: f64,
    pub reserve: Vec<f64>,
}
pub struct Quaternion {
    pub x: f64,
    pub y: f64,
    pub z: f64,
}
impl Axes for Coordinate {
    fn shift(&mut self, Sample: &Axes) -> () { }
    fn fold(&mut self, Sample: &Axes) -> () { }
}
impl Axes for Quaternion {
    fn shift(&mut self, Sample: &Axes) -> () { }
    fn fold(&mut self, Sample: &Axes) -> () { }
}

struct 와 특성  이 경우 더 접근하기 쉽고 효율적입니까? 어떤 경우에 사용해야할지 혼란스러워합니다.

  • 답변 # 1

    상황에 대해 특성과 열거 형을 사용하는 것의 큰 차이점 중 하나는 확장 성입니다. 당신이 Axes 를 만드는 경우  열거 형이면 두 가지 옵션이 유형으로 하드 코딩됩니다. 축의 세 번째 형태를 추가하려면 Axes 를 사용하여 코드 자체를 수정해야 할 형식 자체를 수정해야합니다.  (예 : Axes 에서 일치하는 모든 곳  아마도 변경해야 할 것입니다). 반면에, Axes 를 만들면  특성이라면 기존 코드를 전혀 수정하지 않고 새 유형을 정의하고 적절한 구현을 작성하여 다른 유형의 축을 추가 할 수 있습니다. 라이브러리 외부에서 수행 할 수도 있습니다 (예 : 사용자에 의해.

    고려해야 할 또 다른 중요한 것은 구조체 내부에 얼마나 많은 액세스가 필요한지입니다. 열거 형을 사용하면 구조체 내에 저장된 모든 데이터에 완전히 액세스 할 수 있습니다. Coordinate 모두에서 작동 할 수있는 함수를 작성하려면  그리고 Quaternion  특성을 사용하면 수행 할 수있는 유일한 작업은 Axes 에 설명 된 작업입니다.  특성 (이 경우 Shift )  그리고 Fold ). 예를 들어, Axes 의 구현을 제공  당신이 준, 당신이 단순히 (X,Y,Z) 를 검색 할 수있는 방법이 없습니다   Axes 를 통해 튜플  인터페이스. 어느 시점에서해야한다면 새로운 방법을 추가해야합니다.

    이 유형을 어떻게 사용할 것인지에 대해 더 많이 알지 못하면 이러한 옵션 중 어떤 옵션이 더 나은 선택인지 확실히 말하기는 어렵지만 나라면 열거 형을 사용할 것입니다. 궁극적으로 선호도에 크게 영향을 미치지 만 결정을 내릴 때 고려해야 할 사항에 대한 아이디어를 얻을 수 있기를 바랍니다.

  • 답변 # 2

    @Kwarrtz의 답변에 언급되지 않은 또 다른 차이점은 메모리 관련입니다. .

    enum s는 스택에 직접 저장 될 수 있지만 박스형 특성에는 항상 힙이 필요합니다. 즉, enum 들은 값이 싸지 만 박스형 특성은 아닙니다.

    위즈 위즈  인스턴스는 대부분 작은 변형을 저장하더라도 항상 가장 큰 변형 (대부분의 경우 판별 변수)만큼 큽니다. 다음과 같은 경우에 문제가 될 것입니다 :

    enum
    
    

    이 유형의 N 개의 인스턴스를 벡터에 저장하려면 벡터에 항상 enum Foo { SmallVariant(bool), BigVariant([u64; 100]), } 가 필요합니다  벡터에 N*(100*sizeof::<u64> + sizeOfDiscriminant) 만 포함 된 경우에도 메모리 바이트 s.

    박스형 특성을 사용하는 경우 벡터는 SmallVariant 를 사용합니다. .

    N * sizeOfFatPointer == N * 2 * sizeof::<usize>

  • 이전 javascript - React에서 발송하지 않고 업데이트 된 소품
  • 다음 lua - 멋진 wm의 CPU 온도 위젯