Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does a set determine that two objects are equal in dart?

Tags:

dart

I don't understand how a set determines when two objects are equal. More specific, when does the add method of a set, really adds a new object, and when doesn't it act a new object, because the object is already in the set ?

For example, I have objects from the following class:

class Action {
  final Function function;
  final String description;

  Action(this.function, this.description);

  call() => function();

  toString() => description;
}

Now I would think that the following set would contain 2 elements, as 2 of them are equal:

void main() {
  Set<Action> actions = new Set()
    ..add(new Action(() => print("a"), "print a"))  
    ..add(new Action(() => print("a"), "print a"))
    ..add(new Action(() => print("b"), "print b"));
}

But instead, this set contains 3 Action objects. See the demo. How can I make sure that equal objects are seen as equal in the set ?

like image 801
Kasper Avatar asked Apr 10 '15 17:04

Kasper


People also ask

How do you know if two objects are equal in darts?

The most obvious way to compare two objects is of course the == operator. This will in fact check for equality. To check if two objects are the same instance, we should use identical() .

What is == in Dart?

Dart supports == for equality and identical(a, b) for identity. Dart no longer supports the === syntax. Use == for equality when you want to check if too objects are "equal". You can implement the == method in your class to define what equality means.

How do you compare two lists in darts?

Check if two Lists are Equal Element Wise We shall write a function areListsEqual() to check if the given two lists are equal element by element. As a pre-requisite, we check if both the given variables are lists, and then compare their lengths. list1 and list2 are equal. list1 and list3 are not equal.

How do you compare two classes in flutter?

In this example, we are using the equality operator (==) to compare 2 student objects. But we didn't override that equality operator in our Student class, therefore the program will use the default equality operator defined in the Object class. If we look at the document, it says: /** * The equality operator.


1 Answers

For a comprehensive write-up about operator== in Dart see http://work.j832.com/2014/05/equality-and-dart.html

It just checks if they are equal a == b You can override the == operator to customize this behavior. Keep in mind that also hashCode should be overridden when the == operator is overridden.

class Action {
  @override
  bool operator==(other) {
    // Dart ensures that operator== isn't called with null
    // if(other == null) {
    //   return false;
    // }
    if(other is! Action) {
      return false;
    }
    return description == (other as Action).description;
  }

  // hashCode must never change otherwise the value can't
  // be found anymore for example when used as key 
  // in hashMaps therefore we cache it after first creation.
  // If you want to combine more values in hashCode creation
  // see http://stackoverflow.com/a/26648915/217408
  // This is just one attempt, depending on your requirements
  // different handling might be more appropriate.
  // As far as I am aware there is no correct answer for
  // objects where the members taking part of hashCode and
  // equality calculation are mutable.
  // See also http://stackoverflow.com/a/27609/217408
  int _hashCode;
  @override
  int get hashCode {
    if(_hashCode == null) {
      _hashCode = description.hashCode
    }
    return _hashCode;
  }
  // when the key (description) is immutable and the only
  // member of the key you can just use
  // int get hashCode => description.hashCode
}

try at DartPad

like image 99
Günter Zöchbauer Avatar answered Sep 28 '22 05:09

Günter Zöchbauer