2017-04-09 1 views
4

어떻게 ...이 어떤 다른Rust가 기존 유형의 구현을 금지하는 이유는 무엇입니까?

impl String { 
    fn foo(&self) { 
     //... 
    } 
} 

...이 무엇입니까?

fn foo(s: &String) { 
    //... 
} 

다시 말해, 상자에 특성을 정의하면 유형 구현을 확장 할 수 있습니다. 왜?

+6

와 관계있는의 RFC : https://github.com/rust-lang/rfcs/issues/493. 보다 구체적으로 토론의이 부분으로 이동하는 것이 좋습니다. https://github.com/rust-lang/rfcs/issues/493#issuecomment-266307203 – asteriskTheServer

+6

@asteriskTheServer : 이것은 댓글에서 좋은 답변처럼 들립니다. 의견을 출처로 사용하는 적절한 대답으로 마사지 해보지 않으시겠습니까? –

+2

여기에는 가시성 문제가있는 것으로 보입니다. 'String :: foo'의 가시성이 어떻게 제어 될 것이라고 기대하십니까? 특성은 새로운 특성을 추가하는 것을 지원합니다 :'trait Foo {fn foo (&self);) impl Foo for String {...}'. 여기에는 특성을 임포트하고'foo'를 구현하는 다른 특성들에 의해'String :: foo'의 가시성을 제어 할 수 있습니다. – user4815162342

답변

2

source에 표시된 것과 같이 여러 가지 인수가있어 왜 외부 상자에없는 기존 유형을 구현할 수 없습니까?

  • 로컬 임플란트는 차후 구현으로 인해 손상 될 수 있습니다. 예를 들어, "당신은 국부적으로 concat 연산자로 Vec<T>에 추가를 정의했습니다 ..., 그리고 몇 년 후에 ... 몇 차례의 수학 연산이 대신 수행되어야합니다. 당신이 impl 업그레이드하면 코드가 깨질 것입니다 ... 2. "

  • 코드의 가독성은이 변화에 의해 영향을받을 것이다, 즉, 그것은 "훨씬 더 과도 3를 읽고 그 값을."만들 수

  • 보안 문제가 있습니다. 이것이 허용된다면 기술적으로 가능할 수있는 다음과 같은 시나리오를 고려하십시오. 즉, "공격자가 [일부 라이브러리에서 impl의 변경을 발견 할 수 있고, 백도어로 실행하려는 응용 프로그램의 호출 사이트에서" "실수로"새로운 impl을 이전 impl로 대체하여 취약점을 생성하는 리팩토링 (refactoring) 요청을 풀지 만 라이브러리에서 이전 코드를 참조 할 수 있으며 적의 impl을 매크로에 임베드 할 수 있습니다. 4. "

  • 로컬 impls가 허용 된 경우 로컬 impl이 선호되는 구현이되는 경우를 가정하십시오. 이것은 "일관성 속성 [현재 유지 관리 중] 5"을 위반하게됩니다. " 이 점은 'HashTable'문제를 통해 명확해질 수 있습니다. 5.

    mod foo { 
        impl Hash for i32 { ... } 
    
        fn f(mut table: HashMap<i32, &'static str>) { 
         table.insert(0, "hello"); 
         ::bar::f(&table); 
        } 
    } 
    
    mod bar { 
        impl Hash for i32 { ... } 
    
        fn f(table: &HashMap<i32, &'static str>) { 
         assert_eq!(table.get(0), Some("hello")); 
        } 
    } 
    
관련 문제