2014-11-13 2 views
0

저는 현재 녹이 슬며 잠자리에 들기도 전에 수학 라이브러리를 작성하고 있습니다. 해결하려는 문제는 간단합니다. 필자는 필드와 링을 모델링하고 싶지만 수명이 오래 걸릴 수는 없습니다.특성에 따른 수명

ring.rs :

pub trait Ring { 
    fn characteristic() -> int; 

    fn is_unit(&self) -> bool; 

    fn is_field() -> bool; 
} 

field.rs : 여기

코드의

use ring::Ring; 

pub trait Field : Ring { 
    fn some_field_method() -> bool { 
     true 
    } 
} 

impl Ring for Field { 
    fn is_field() -> bool { 
     true 
    } 
} 

나는 다음과 같은 오류 얻을 컴파일 :

/src/field.rs:9:15: 9:20 error: explicit lifetime bound required 
/src/field.rs:9 impl Ring for Field { 
           ^~~~~ 

I을 녹이있는 문서를 읽으십시오. etime 섹션과 그것에 대한 rust-by-example 섹션을 참조하십시오. 평생 뒤에 숨어있는 동기는 나에게 분명하고 모든 주어진 예를 이해합니다. 하지만 여기서, 나는 완전히 잃어버린다.

Btw : 이것은 축소 된 버전입니다. 필자는 필드에 수명을 부여하고 임 플린과 링과 다양한 조합을 말했습니다.

누구든지 여기에서 일어나는 일을 설명하거나, 너무 구체적 인 경우 평생과 특성을 다루는 방법을 설명 할 수 있습니다.

감사

+1

정확히 무엇을하려합니까? 'Field'가 이미'Ring'에서 파생 된 동안 'Field' 특성 객체에 대해'Ring '특성을 구현합니까? – Levans

+0

@Levans Field in Ring을 부분적으로 구현하고 싶습니다. 어쩌면 또 다른 예제가 그것을 명확히 : 나는 동물의 특성을 get_leg_number와 get_color가 있어야한다. 그리고 나는 동물의 특성을 구현하지만 기본적으로 get_leg_number를 4로 설정하는 암소 특성을 원한다. –

+0

나는 더 이상 존재하지 않는 동물이 존재한다고 추가해야한다. 소처럼 전문화되어 있습니다. 반지가 그 자체에 존재해야합니다. 그러나 언제나 필드는 언제나 반지가되어야합니다. –

답변

2

당신은 그들이 작동하는 방법을 정말없는 특성과 상속 같은 패턴의 어떤 왕을 위해 노력하고 있습니다.

특성은 일부 언어로 제공되는 인터페이스와 비슷한 것으로 생각할 수 있습니다. 특성은 구조체에서 몇 가지 방법을 제공한다는 보증입니다.

구문 trait Foo : Bar 어떻게 든 특성 Foo이 특징 Bar의 상위 집합이라고하고, 구조체에 대한 Foo을 구현하는 것은 물론 Bar을 구현하는 것을 의미하지 않습니다. trait Foo은 이미 특성을 구현하는 구조체에 대해서만 구현할 수 있습니다. Bar. 당신은 여전히 ​​두 가지 특성을 직접 구현해야합니다. 귀하의 예를 다음

, 당신의 접근 방식은 다음과 같이 될 것이다 :

첫째, 형질 링을 정의

pub trait Ring { 
    fn characteristic(&self) -> int; 

    fn is_unit(&self) -> bool; 

    fn is_field(&self) -> bool { 
     // Default value : not every Ring is a Field 
     false 
    } 
} 

다음, 형질 링을 필요로하는 특성 필드,

pub trait Field : Ring { 
    fn some_field_method(&self) -> bool { 
     // This is a default value as well 
     true 
    } 
} 

그러면 구조체가 반지와 필드 둘 다가됩니다.

struct MyField; 

// First, implement Ring for MyField 
impl Ring for MyField { 
    fn characteristic(&self) -> int { 
     2i 
    } 

    fn is_unit(&self) -> bool { 
     false 
    } 

    fn is_field(&self) -> bool { 
     // We override the default value : MyField is a Field 
     true 
    } 
} 

// Then we can implement Field for MyField 
impl Field for MyField { 
    // Nothing here if we keep default implementation of some_field_method 
} 

이제 이상한 수명에 대한 설명입니다.

impl Ring for Field {...}을 작성할 때 실제로 특성 개체 Field에 대해 특성 인 Ring을 구현하려는 경우.

특성 개체는 특성 중 하나에 대한 참조와 같은 구조체에 대한 참조를 사용할 때 얻을 수있는 것이며, 사용하기가 특이하며 수명이있는 일부 재생이 필요합니다.

그러나 대부분의 상황에서는 게임을 할 필요가 없으며 고전적인 제네릭으로 충분합니다.

자세한 내용은 my answer here을 참조하십시오.

+0

빠른 답변에 감사드립니다. 나는 또한 당신의 다른 대답을 읽었다. 새로운 통찰력을 많이 주었지만 그 이유를 완전히 이해하려면 조금만 더 수정해야합니다. 당분간 나는 갈 수있다 :) –