1

我在 Eiffel 做作业,我在执行我的 ensure 子句时遇到了麻烦。您是否需要一些特殊的语法来包含变量或函数?

这是我目前的“放置”功能的代码

    put(key: K; value: V)
    require

            key /= void
    local
        tmp:ITEM[K,V]
    do

        create tmp.make(key, value)
        list.put_front (tmp)
        count := count + 1
    ensure

    count = old count + 1 and list.has(key, value)
    end

这是“有”功能的代码

    has(key:K; val:V):BOOLEAN
require
    key /= void
local

    flag: INTEGER
    do

    flag := 0
    from
        list.start
    until
        list.exhausted
    loop
        if list.item.getkey = key then
            if list.item.getvalue = val then
                flag := 1
            end
        end
        list.forth
    end
    if flag = 1 then
        Result := true
    else
        Result := false
    end
    ensure
        --???   
end

任务是通过链表实现一个地图广告。'put' 函数将 item(key, value) 插入到列表中。'has' 函数检查列表是否包含(键值)对。

任何帮助将不胜感激。

4

1 回答 1

1

可能只是

Result = across list as c some (c.item.key = key and c.item.value = value) end

但是代码上还有其他几条注释:

  1. 我看不到该属性在哪里key /= Void使用。所以看起来它不是必需的。
  2. 鉴于put插入类型元素的代码ITEM,后置条件也put应该使用across list ... end代替list.has (key, value)。所以我怀疑它应该只是has (key, value)没有list.在它前面。
  3. 我看不出使用辅助变量有什么意义flag。保留变量Result就可以了。
  4. Eiffel 中的所有变量均由默认值初始化,因此无需在例程开始时分配0flag(或falseResult简化版本中)。
  5. 通常在 Eiffel 中不需要专门的 getter,所以通常代码list.item.getkey看起来像list.item.key.
  6. list.finish当找到所需元素时,可以通过调用将光标移动到列表的最后一项来抢先退出循环。然后在list.forth满足循环退出条件并且循环终止之后。
于 2013-05-26T15:21:35.340 回答