2017-10-27 2 views
0

Ich habe einige Codes wie folgt:Generisches Umwandlung in Eiffel auf ganzzahlige

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" ist der Typ von "K". Der reelle Wert darin ist jedoch ein Integer-Typ.

also "wenn tempK ~ 1 dann" funktioniert gut. Aber "tempI: = tempK" funktioniert nicht.

Wie kann ich den K-Typ von tempK in Ganzzahl konvertieren? damit es kompilieren kann?

Antwort

1

In diesem speziellen Fall, wo Sie wissen, dass tempK1 ist, wird tempI := 1 tun. Wenn die Idee darin besteht, tempI zu initialisieren, sobald die in der Liste gespeicherten Werte vom Typ INTEGER sind, gibt es mehrere Möglichkeiten. Eine davon ist ein Objekt-Test zu verwenden:

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

jedoch in diesem Fall der Test für jedes Element durchgeführt wird, d.h. ineffizient. Änderung des Codes für den Listentyp vor der Schleife wird dazu beitragen, testen:

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

Wenn der einzige Betrieb in der Schleife die Zuordnung ist, ist der entsprechende Code nur das letzte Element der Liste zu nehmen:

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

Anstelle der Spezialisierung könnte der Code auch verallgemeinert werden, um einen generischen Agenten zu übernehmen, dem der Schlüssel übergeben wird, und der Client liefert die Prozedur zur Handhabung des Schlüssels. Aber das könnte zu viel sein, abhängig davon, was der Zweck der Aufgabe ist, die Sie lösen.