Сообщение об ошибке относится к S COOP - модели параллельного программирования, встроенной в Eiffel. В соответствии с этим функция может быть вызвана для отдельного объекта, только когда объект управляется . Это достигается, когда целью вызова является аргумент функции или когда используется специальная отдельная инструкция . В вашем случае последний будет выглядеть так:
separate l_cursor_a.item as x do
if x.is_equal (v) then
Result := True
end
end
Почему l_cursor_a.item
в первую очередь считается отдельным? Он имеет тип G
, а формальный обобщенный тип c является неограниченным, что идентично наличию ограничения detachable separate ANY
(поэтому, скорее всего, приведенный выше код не будет компилироваться, вам необходимо убедиться, что x
присоединяется перед вызовом is_equal
).
Оператор равенства =
не выполняет никаких вызовов (за исключением случаев, когда задействованные типы раскрываются, но расширенные типы никогда не разделяются). Для ссылочных типов (включая отдельные) просто проверяется, являются ли две ссылки одинаковыми. Это объясняет, почему ошибка исчезает при замене is_equal
на =
.
Альтернативное решение, позволяющее избежать появления сообщения об ошибке, состоит в том, чтобы изменить ограничение формального генерика c, чтобы оно не было отдельным: MY_LINKED_LIST [G -> detachable ANY]
.
Примечание. Инструкция проверки check attached l_cursor as l_cursor_a then ...
представляется избыточной, компилятор должен автоматически определить, что l_cursor
присоединено.