在Eiffel中进行整数转换

时间:2017-10-27 04:52:26

标签: eiffel

我有一些代码如下:

keys: LINKED_LIST[K]
...
test
local
    tempK:K
    tempI:INTEGER
do
...
across
    keys as cursor
loop
    tempK := cursor.item
    if tempK ~ 1 then
       tempI := tempK
    end
end
...
end

“cursor.item”是“K”的类型。但是,里面的实际值是整数类型。

因此,“如果tempK~1那么”工作正常。但是“tempI:= tempK”不起作用。

如何将tempK的K类型转换为整数?这样它可以编译吗?

1 个答案:

答案 0 :(得分:1)

在这种特殊情况下,您知道tempK1tempI := 1会这样做。

如果想要在列表中存储的值为tempI类型时尽快初始化INTEGER,则有几种方法。一种是使用对象测试:

if attached {INTEGER} tempK as i then
    tempI := i
end

然而,在这种情况下,对每个元素执行测试,即效率低下。在循环之前更改代码以测试列表类型将有所帮助:

if attached {LINKED_LIST [INTEGER]} keys as integer_keys then
    ...
    across
        integer_keys as cursor
    loop
        tempI := cursor.item
    end
    ...
end

如果循环中唯一的操作是赋值,则等效代码只取列表的最后一个元素:

...
if not keys.is_empty and then attached {LINKED_LIST [INTEGER]} keys as integer_keys then
    tempI := integer_keys.last
end
...

代替专业化,代码也可以通用化以获取将传递密钥的通用代理,并且客户端将提供处理密钥的过程。但这可能太多了,这取决于你要解决的任务的目的是什么。