Search code examples
eiffeleiffel-studio-18

How to test objects of formal generic types for equality in Eiffel?


I should test for equality two generic attributes like

a, b: G
...
Result := a.is_equal (b)

but VUTA (target rule validity) says "separate target of the Object_call is not controlled". What can I do?


Solution

  • Here are different options to fix this issue that rely only on changes in your code:

    1. Add a non-separate constraint for the formal generic parameter. By default, the constraint is detachable separate ANY. E.g., if you have the declaration

      class FOO [G] ...
      

      then specifing explicit constraint ANY (without separate) should do the trick:

      class FOO [G -> ANY] ...
      

      With this change, all instances of type G also become attached. If this should be avoided, the constraint ANY should be replaced with detachable ANY, but the code should be updated to check that the attributes are attached before use:

      Result := attached a as x and then attached b as y and then x.is_equal (y)
      
    2. Wrap the target of the call to make it controlled. Here is the example with a separate instruction (similar code could be written using a dedicated feature, e.g. if you have many such equality tests):

      separate a as x do
          Result := attached x and then attached b as y and then x.is_equal (b)
      end
      

    It's also possible to change your project settings to avoid using SCOOP if it is not needed.