구현이 HashMap을 래핑하는 특성에서 수명 매개 변수를 제거 하시겠습니까?

리치 아포 다카

나는 몇 가지 방법을 포장하고 싶습니다 HashMap등을 insert하고 keys. 이 시도가 컴파일되고 테스트가 통과됩니다.

use std::collections::HashMap;
use std::hash::Hash;

pub trait Map<'a, N: 'a> {
    type ItemIterator: Iterator<Item=&'a N>;

    fn items(&'a self) -> Self::ItemIterator;
    fn insert(&mut self, item: N);
}

struct MyMap<N> {
    map: HashMap<N, ()>
}

impl<N: Eq + Hash> MyMap<N> {
    fn new() -> Self {
        MyMap { map: HashMap::new() }
    }
}

impl<'a, N: 'a + Eq + Hash> Map<'a, N> for MyMap<N> {
    type ItemIterator = std::collections::hash_map::Keys<'a, N, ()>;

    fn items(&'a self) -> Self::ItemIterator {
        self.map.keys()
    }

    fn insert(&mut self, item: N) {
        self.map.insert(item, ());
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[derive(Eq, Hash, PartialEq, Debug)]
    struct MyItem;

    #[test]
    fn test() {
        let mut map = MyMap::new();
        let item = MyItem { };

        map.insert(&item);

        let foo = map.items().collect::<Vec<_>>();

        for it_item in map.items() {
            assert_eq!(it_item, &&item);
        }

        assert_eq!(foo, vec![&&item]);
    }
}

Map가능한 경우 수명 매개 변수의 필요성을 제거하고 싶지만 지금까지 방법을 찾지 못했습니다. 이 문제 std::collections::hash_map::Keys는 수명 매개 변수가 필요한 의 정의에서 비롯된 것 같습니다 .

Map에 수명 매개 변수를 제공해야 할 때까지 특성 작업 을 재정의하려고 시도합니다 Keys.

use std::collections::HashMap;
use std::hash::Hash;

pub trait Map<N> {
    type ItemIterator: Iterator<Item=N>;

    fn items(&self) -> Self::ItemIterator;
    fn insert(&mut self, item: N);
}

struct MyMap<N> {
    map: HashMap<N, ()>
}

impl<N: Eq + Hash> MyMap<N> {
    fn new() -> Self {
        MyMap { map: HashMap::new() }
    }
}

// ERROR: "unconstrained lifetime parameter"
impl<'a, N> Map<N> for MyMap<N> {
    type ItemIterator = std::collections::hash_map::Keys<'a, N, ()>;
}

컴파일러는 수명을 Map특성에 다시 도입하지 않고 수정할 수 없었던 제약없는 수명 매개 변수에 대한 오류를 발행합니다 .

이 실험의 주요 목표는 Box이전 시도에서 제거 할 수있는 방법을 확인하는 것이 었습니다 . 이 질문에서 설명하는 것처럼 반복자를 반환하는 또 다른 방법입니다. 그래서 지금은 그 접근 방식에 관심이 없습니다.

수명 매개 변수 도입하거나 사용 하지 않고 어떻게 설정하고 Map구현할 Box 있습니까?

코더 -256

생각해야 할 점 hash_map::Keys은 일반적인 수명 매개 변수가 있기 때문에 어떤 이유로 든 필요할 수 있으므로 추상화하는 특성이 Keys필요할 것입니다.

이 경우의 정의에서 수명 Map을 지정하는 방법이 필요 합니다. ( 입니다 ).ItemIteratorItemItem&'a N

이것이 당신의 정의였습니다.

type ItemIterator: Iterator<Item=&'a N>

을 구현하는 모든 구조체에 대해 Map연결된 구조체 ItemIterator가 참조의 반복자 여야 한다고 말하려고 합니다. 그러나이 제약은 추가 정보 없이는 쓸모가 없습니다. 참조가 얼마나 오래 지속되는지 알아야합니다 (따라서 type ItemIterator: Iterator<Item=&N>오류가 발생하는 이유 :이 정보가 누락되었으며 현재 AFAIK를 제거 할 수 없음).

따라서 'a각각의 &'a N유효 기간을 보장하는 일반적인 수명의 이름을 지정합니다 . 이제 차용 검사기를 충족하고에 &'a N대해 유효 함을 증명하고에 대한 'a몇 가지 유용한 약속을 설정 'a하려면 다음을 지정합니다.

  1. &self제공된 참조에 대한 모든 값 items()은 최소한 'a. 이렇게하면 반환 된 각 항목 ( &'a N) &self에 대해 항목 참조가 유효한 상태를 유지하기 위해 참조가 여전히 유효해야합니다 self. 즉, 항목이 오래 지속되어야합니다 . 이 불변성을 사용하면 &self의 반환 값에서 참조 할 수 있습니다 items(). 으로 이것을 지정했습니다 fn items(&'a self). (참고 : my_map.items()는 실제로를 약칭합니다 MyMap::items(&my_map).)
  2. N의 자체도 유효 기간 동안 유효해야합니다 'a. 이것은 객체가 영원히 살지 않는 'static참조 (비 참조 라고도 함 )를 포함하는 경우 중요합니다 . 이렇게하면 항목에 N포함 된 모든 참조가 최소한 'a. 제약 조건과 함께 이것을 지정했습니다 N: 'a.

요약하자면,의 정의 Map<'a, N>는 구현 자의 items()함수 ItemIterator가에 유효한 'a항목에 대해 유효한 참조를 반환해야합니다 'a. 이제 구현 :

impl<'a, N: 'a + Eq + Hash> Map<'a, N> for MyMap<N> { ... }

당신이 볼 수 있듯이, 'a당신이 어떤 사용할 수 있도록 매개 변수는 완전히 구속되지이다 'a의 방법에 Map의 인스턴스를 MyMap만큼으로, N의의 제약 조건을 충족 N: 'a + Eq + Hash. 전달 된지도가 모두 유효한 'a가장 긴 수명이 자동으로되어야 합니다.Nitems()

어쨌든, 여기서 설명하는 것은 스트리밍 반복기로 알려져 있으며 수년 동안 문제가되어 왔습니다. 일부 관련 토론은 승인되었지만 현재 구현되지 않은 RFC 1598을 참조하십시오 (하지만 압도 될 준비가되어 있음).

마지막으로, 일부 사람들이 언급했듯이, Map.NET에 대한 기본 제공 IntoIterator<Item=&'a N>및 별도의 특성 의 조합으로 더 잘 표현 될 수 있으므로 처음부터 특성이 나쁜 디자인 일 수 있습니다 insert(). 이것은 for루프 등에서 사용되는 기본 반복기 가 내장 반복기와 일치하지 않는 항목 반복자가 될 것이라는 것을 의미 HashMap하지만, 귀하의 특성의 목적이 완전히 명확하지 않으므로 귀하의 디자인이 의미가 있다고 생각합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

수명 매개 변수를 사용하지 않는 특성 내부 유형에 대해 명명 된 수명을 구현하는 방법은 무엇입니까?

분류에서Dev

동적 매개 변수 이름을 Origen :: Parameters에 전달 하시겠습니까?

분류에서Dev

두 날짜 사이에 몇 달을 제공하는 함수를 어떻게 구현 하시겠습니까?

분류에서Dev

매개 변수 또는 변수를 사용하여 SSIS에서 연결 시간 제한을 설정 하시겠습니까?

분류에서Dev

생성자 매개 변수를 전달하는 동안 LightInject에 서비스를 등록 할 때 수명을 지정 하시겠습니까?

분류에서Dev

Eclipse에서 수천 개의 댓글을 제거 하시겠습니까?

분류에서Dev

HashMap을 사용하여 반복기를 매핑하는 함수 구현에 대한 평생 문제

분류에서Dev

iOS. 요청에 대한 증분 매개 변수를 구현 하시겠습니까?

분류에서Dev

mysql에서 매개 변수 테이블을 삭제하는 프로 시저 또는 함수를 생성 할 수 있습니까?

분류에서Dev

VBScript를 사용하는 ADO의 명령 개체에 특정 매개 변수 만 지정 하시겠습니까?

분류에서Dev

IMappingAction을 구현하는 클래스에 매개 변수 전달

분류에서Dev

매개 변수를 함수에 전달하고 해당 함수가 전달 된 매개 변수를 포함하는 변수 이름을 생성하도록 하시겠습니까?

분류에서Dev

bash : 배열에서 변수를 제거 하시겠습니까?

분류에서Dev

빌드 매개 변수에서 빌드시 슬레이브를 프로그래밍 방식으로 결정하도록 Jenkins를 구성 하시겠습니까?

분류에서Dev

기록에서 이전 개정을 제거하려면 개정 상위를 변경 하시겠습니까?

분류에서Dev

중복 개수를 표시하고 중복 항목을 동시에 제거 하시겠습니까?

분류에서Dev

URL에 매개 변수를 추가 하시겠습니까?

분류에서Dev

dll에 매개 변수를 전달 하시겠습니까?

분류에서Dev

명령 줄에서 명령을 반복하는이 vim 매핑을 개선 할 수 있습니까?

분류에서Dev

양수 값이있는 열을 제거 하시겠습니까?

분류에서Dev

요청 URL 내에서 이상한 설명되지 않은 추가 매개 변수를 제거하는 방법

분류에서Dev

매개 변수를 사용하여 준비된 명령문을 구현하는 방법은이 쿼리에서도 가능합니까?

분류에서Dev

특정 크기의 배열을 보유하도록 데이터 구조를 매개 변수화 하시겠습니까?

분류에서Dev

'속성없이이 파일을 복사 하시겠습니까?'를 제거 할 수 있습니까?

분류에서Dev

Haskell에서 상속 된 매개 변수를 사용하여이 특정 하위 함수에 명시 적으로 서명을 제공하는 방법은 무엇입니까?

분류에서Dev

Holoviz / Param / Panel : Parameterized 클래스에서 매개 변수를 보유하는 매개 변수 패널의 제목을 변경하거나 숨기거나 삭제할 수 있습니까?

분류에서Dev

ROBLOX 플레이어의 메시지에서 매개 변수를 감지 하시겠습니까? (LUA)

분류에서Dev

데이터 유형을 매개 변수로 선택 하시겠습니까?

분류에서Dev

functools LRU 캐시를 사용할 때 비 입력 매개 변수를 제거 하시겠습니까?

Related 관련 기사

  1. 1

    수명 매개 변수를 사용하지 않는 특성 내부 유형에 대해 명명 된 수명을 구현하는 방법은 무엇입니까?

  2. 2

    동적 매개 변수 이름을 Origen :: Parameters에 전달 하시겠습니까?

  3. 3

    두 날짜 사이에 몇 달을 제공하는 함수를 어떻게 구현 하시겠습니까?

  4. 4

    매개 변수 또는 변수를 사용하여 SSIS에서 연결 시간 제한을 설정 하시겠습니까?

  5. 5

    생성자 매개 변수를 전달하는 동안 LightInject에 서비스를 등록 할 때 수명을 지정 하시겠습니까?

  6. 6

    Eclipse에서 수천 개의 댓글을 제거 하시겠습니까?

  7. 7

    HashMap을 사용하여 반복기를 매핑하는 함수 구현에 대한 평생 문제

  8. 8

    iOS. 요청에 대한 증분 매개 변수를 구현 하시겠습니까?

  9. 9

    mysql에서 매개 변수 테이블을 삭제하는 프로 시저 또는 함수를 생성 할 수 있습니까?

  10. 10

    VBScript를 사용하는 ADO의 명령 개체에 특정 매개 변수 만 지정 하시겠습니까?

  11. 11

    IMappingAction을 구현하는 클래스에 매개 변수 전달

  12. 12

    매개 변수를 함수에 전달하고 해당 함수가 전달 된 매개 변수를 포함하는 변수 이름을 생성하도록 하시겠습니까?

  13. 13

    bash : 배열에서 변수를 제거 하시겠습니까?

  14. 14

    빌드 매개 변수에서 빌드시 슬레이브를 프로그래밍 방식으로 결정하도록 Jenkins를 구성 하시겠습니까?

  15. 15

    기록에서 이전 개정을 제거하려면 개정 상위를 변경 하시겠습니까?

  16. 16

    중복 개수를 표시하고 중복 항목을 동시에 제거 하시겠습니까?

  17. 17

    URL에 매개 변수를 추가 하시겠습니까?

  18. 18

    dll에 매개 변수를 전달 하시겠습니까?

  19. 19

    명령 줄에서 명령을 반복하는이 vim 매핑을 개선 할 수 있습니까?

  20. 20

    양수 값이있는 열을 제거 하시겠습니까?

  21. 21

    요청 URL 내에서 이상한 설명되지 않은 추가 매개 변수를 제거하는 방법

  22. 22

    매개 변수를 사용하여 준비된 명령문을 구현하는 방법은이 쿼리에서도 가능합니까?

  23. 23

    특정 크기의 배열을 보유하도록 데이터 구조를 매개 변수화 하시겠습니까?

  24. 24

    '속성없이이 파일을 복사 하시겠습니까?'를 제거 할 수 있습니까?

  25. 25

    Haskell에서 상속 된 매개 변수를 사용하여이 특정 하위 함수에 명시 적으로 서명을 제공하는 방법은 무엇입니까?

  26. 26

    Holoviz / Param / Panel : Parameterized 클래스에서 매개 변수를 보유하는 매개 변수 패널의 제목을 변경하거나 숨기거나 삭제할 수 있습니까?

  27. 27

    ROBLOX 플레이어의 메시지에서 매개 변수를 감지 하시겠습니까? (LUA)

  28. 28

    데이터 유형을 매개 변수로 선택 하시겠습니까?

  29. 29

    functools LRU 캐시를 사용할 때 비 입력 매개 변수를 제거 하시겠습니까?

뜨겁다태그

보관