2013-01-08 7 views
2

Rebol 2에는 해시가있었습니다! MAP뿐만 아니라 유형! 유형. 이는 모두가뿐만 아니라 경로 기반 선택에 의해 찾기 및 선택 기능에 의해 지원되었다 :MAP의 멤버쉽을 테스트하는 일반적인 방법! Rebol 2와 3 모두에서 일하고 있습니까?

>> m: to map! [someKey someValue] 
== make hash! [someKey someValue] 

>> m/someKey 
== someValue 

>> select m 'someKey 
== someValue 

는 키가지도에없는 것을 감지하려면 NONE

에 대해 찾기 및 테스트 사용할 수 있습니다
>> find m 'someOtherKey 
== none 

그러나 경로 기반 선택이 경우 오류가 발생하는 것입니다 : 한편

>> m/someOtherKey 
** Script Error: Invalid path value: someOtherKey 
** Near: m/someOtherKey 

는 REBOL 3 만 MAP가 있습니다! 그러나 및 SELECT 은 시리즈 유형 만 지원하고 MAP! 더 이상 시리즈로 간주되지 않습니다. (?) :

>> m/someOtherKey 
== none 

... 당신의 키 (변수에있는 경우 또는 내가 볼 수있는 유일한 방법지도와 상호 작용하는 경로의 비 회원의 경우 오류가 발생하지 않는 선택을 통해 문자열) PAREN을 사용해야합니다! 또한 REBOL 2에서 작동하지만 오류를 던지는 대신에 존재하지 않는 무언가를 요청할 때 NONE을 반환하지 동일한주의와

>> var: 'someKey 
== someKey 

>> m/(var) 
== someValue 

.

그렇다면 경로 선택은 Rebol 2와 3의 키 값을 검색하는 "일반적인"방법입니다. 그럼에도 불구하고 일반적인 테스트 방법은 보이지 않습니다. 회원이 부족합니다.. 어떻게 처리하나요?

답변

3

세 가지 참고 사항 :

  1. 대부분 즉시 귀하의 질문에 관한 다음 상호 작용이 같이뿐만 아니라 REBOL 3에서 잘 작동 select : 사양 살펴보면

    >> system/version 
    == 2.100.111.4.4 ; That's Rebol 3 A111. 
    
    >> m: map [a 1 b 2 c 3] 
    == make map! [ 
        a 1 
        b 2 
        c 3 
    ] 
    
    >> select m 'b 
    == 2 
    
    >> select m 'd 
    == none 
    

    예를 들어 ? series을 사용하여 R3에 select의 값을 입력하면 다음과 같은 형식의 값을 첫 번째 인수로 받아들입니다. series!, port!, map! (!), object!, none!.

  2. R2에는 실제로 map! 유형이 없습니다. R2에 대한 "R2/Forward"포워드 호환성 레이어의 일부로 hash!을 사용하여 가짜입니다. (당신이 당신을 공격 할 수 있습니다 방식을 볼 R2와 R3의 to map! [a 1 a 2]에서 얻을 및 결과 무엇을 봐.) select 당신이 정말로 값으로 #[none]와 관련된 모든 관련된 값이나 키를 사용하지 않는 키를 구별 할 수없는

  3. 참고. 당신이 정말로 그 구별을해야하는 경우, 그것은 당신이 map!의 열쇠를 검색 할 수 words-of을 사용할 수 있습니다 R3에 할 쉽게 :

    >> words-of map [a 1 b 2] 
    == [a b] 
    

    는 그러나, 아직 R2로 백 포팅되지 않았습니다.

    그러나, 구현 내부에 의존 간주 block! 다시 map! (R3) 또는 hash! (R2)을 변환하고, 키만 수득 extract을 이용 될 수있는 하나 개 이상의 휴대 방법 :

    >> m: to map! [a 1 b 2] 
    >> extract to block! m 2 
    == [a b] 
    
+0

아아! 나는 FIND를 점검하고 그것이 시리즈 전용 타입을위한 것인지를 확인한 다음 SELECT를 체크하지 않았다. 그리고 당신은'해시! '에 대해 옳았습니다. 절대로 다시 입력하지 마십시오. 나는 항생제를 비난하기로 결정했다. :-) – HostileFork