我正在埃菲尔做作业,而我在执行我的保证条款时遇到了麻烦。是否需要包含变量或函数的特殊语法?
这是我的'put'功能
目前的代码 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'功能的代码
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
作业是通过链接列表实现地图adt。 'put'函数将项(键,值)插入列表中。 'has'函数检查列表是否包含(键值)对。
非常感谢任何帮助。
答案 0 :(得分:1)
可能只是
Result = across list as c some (c.item.key = key and c.item.value = value) end
但是对代码还有其他一些评论:
key /= Void
的位置。所以它看起来不是必需的。put
的代码插入ITEM
类型的元素,put
的后置条件也应使用across list ... end
而不是list.has (key, value)
。所以我怀疑它应该只是has (key, value)
而不是list.
。flag
的任何意义。保留变量Result
也可以。0
分配给flag
(或false
至Result
在例行公事的开始。list.item.getkey
看起来像list.item.key
。list.finish
来抢先退出循环,list.forth
在找到所需元素时将光标移动到列表的最后一项。然后在{{1}}之后满足循环退出条件并且循环终止。