2

Rebol 2 には HASH がありました。タイプだけでなくMAP!タイプ。どちらも FIND 関数と SELECT 関数、およびパスベースの選択でサポートされていました。

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

>> m/someKey
== someValue

>> select m 'someKey
== someValue

キーがマップにないことを検出するには、FIND を使用して NONE に対してテストできます。

>> find m 'someOtherKey
== none

ただし、この場合、パスベースの選択ではエラーが発生します。

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

一方、Rebol 3 には MAP! しかありません。ただし、FINDと SELECTはシリーズ タイプと MAP のみをサポートします。もはやシリーズとは見なされません。マップを操作する唯一の方法 (?) は、非メンバーシップの場合にエラーをスローしないパス選択によるものです。

>> m/someOtherKey
== none

...そして、キーが変数 (または文字列) にある場合は、PAREN を使用する必要があります!

>> var: 'someKey
== someKey

>> m/(var)
== someValue

これは Rebol 2 でも機能しますが、存在しないものを要求したときに NONE を返す代わりにエラーをスローするという同じ警告があります。

したがって、これが正しいとすれば、パス選択は Rebol 2 および 3 のキーから値を取得する「一般的な」方法です。それにもかかわらず、メンバーシップの欠如をテストする一般的な方法は見当たりません。これをどのように処理しますか?

4

1 に答える 1

3

次の 3 つの点に注意してください。

  1. select次の相互作用が示すように、Rebol 3 でも問題なく動作します。

    >> 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
    

    selectR3の の仕様を(例を使用して? series) 見ると、次の型の値を最初の引数として受け入れることがすぐにわかります: series!port!map!(!) object!none!

  2. R2 には実際には型がありませんmap!hash!R2 の「R2/Forward」前方互換性レイヤーの一部として使用して偽造されます。to map! [a 1 a 2]( R2 と R3でどのような結果が得られるかを見て、これがどのように影響するかを確認してください。)

  3. select値が関連付けられていないキーと値として関連付けられているキーを実際には区別できないことに注意してください#[none]。その区別が本当に必要な場合は、R3 で簡単に行うことができます。R3 では、次words-ofのキーを取得するために使用できますmap!

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

    ただし、これはまだ R2 にバックポートされていません。

    ただし、実装内部に依存していると見なされる可能性のあるもう 1 つの移植可能な方法は、map!(R3) またはhash!(R2) を に戻しblock!、 を使用extractしてキーのみを取得することです。

     >> m: to map! [a 1 b 2]
     >> extract to block! m 2
     == [a b]
    
于 2013-01-08T04:54:02.203 に答える