MAP上的Eiffel Iterable实现?

时间:2014-06-26 18:17:31

标签: iterator iterable eiffel

我有一个名为MAP的课程:

 class MAP [KEY,VAL]
       inherit ITERABLE [KEY]

我在地图游标中实现了新游标,返回

MAP_ITERATOR_CURSOR [KEY]

并将该可迭代游标传递给KEYS数组以迭代

我实施了MAP_ITERATOR_CURSOR [KEY]

 class MAP_ITERATOR_CURSOR [KEY]
       inherit ITERATION_CURSOR [KEY]

这个课我实现了功能项:VAL,但由于该课程是使用KEY定义的,因此我无法识别VAL如何获得MAP_ITERATOR_CURSOR [KEY]项目功能返回与我们当前所在的密钥相关联的VAL

知道MAP有一个名为item的函数,它接受键并返回与该键相关联的VAL

item (k: KEY): VAL 

2 个答案:

答案 0 :(得分:2)

只要MAP [KEY, VAL]继承ITERABLE [KEY]ITERATION_CURSOR的通用参数就会绑定到KEY。但是{ITERATION_CURSOR}.item只是一个正常的功能,需要重新声明,重命名等。因此,有几种方法可以满足您的需求:

  1. 声明MAP_ITERATOR_CURSOR有两个正式的泛型并声明{MAP}.new_cursor如下:

    class MAP [KEY, VAL] inherit ITERABLE [KEY] feature
        new_cursor: MAP_ITERATOR_CURSOR [KEY, VAL]
            do
                create Result.make (Current)
            end
    end
    
    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit ITERATION_CURSOR [KEY]
    create make
    feature
        make (t: like target)
            do
                target := t
            end
        target: MAP [KEY, VAL]
        item: KEY ...
        value: VAL
            do
                Result := target.item (item)
            end
    end
    

    然后客户端代码可以看起来像

    across map as c loop
        -- Use `c.item` of type KEY.
        -- Use `c.value` of type VAL.
    end
    
  2. 如果要求{MAP_ITERATOR_CURSOR}.item的类型为VAL,则第一种方法是使用与上述完全相同的代码,但重命名来自{{item的功能1}}:

    ITERABLE

    然后客户端代码可以看起来像

    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit
        ITERATION_CURSOR [KEY] rename item as key end
    ...
        key: KEY ...
        item: VAL
            do
                Result := target.item (key)
            end
    end
    
  3. 可以从一开始就对across map as c loop -- Use `c.item` of type VAL. -- Use `c.key` of type KEY. end 类型的项执行迭代。在这种情况下,VAL的实际通用应为ITERABLE

    VAL

    客户端代码与案例2类似,但class MAP [KEY, VAL] inherit ITERABLE [VAL] feature new_cursor: MAP_ITERATOR_CURSOR [KEY, VAL] do create Result.make (Current) end end class MAP_ITERATOR_CURSOR [KEY, VAL] inherit ITERATION_CURSOR [VAL] create make feature make (t: like target) do target := t end target: MAP [KEY, VAL] item: VAL do Result := target.item (key) end key: KEY -- This feature can be not exported, or even not present -- as soon as `item` can be implemented. end 可能不可用:

    key
  4. 在3中,across map as c loop -- Use `c.item` of type VAL. end 中的正式通用KEY是为方便起见而保留的。如果有某种方法可以访问MAP_ITERATION_CURSOR项,则可以将其删除,但这可能会引发与访问MAP,一致性和CAT调用相关的其他一些问题。因此,虽然它可能是可行的,但我不会这样做。

答案 1 :(得分:0)