Igualdade no Pony

    O pónei apresenta duas formas de igualdade: por estrutura e por identidade.

    Igualdade de identidade

      A verificação da igualdade de identidade no Pony é feita através da palavra-chave. é verificar se os dois itens são os mesmos.

    if None is None then
      // Verdade!
      // Há apenas 1 Nenhum, então a identidade é a mesma
    
    let a = Foo("hi")
    let b = Foo("hi")
    
    if a is b then
      // Não. Isso é falso
    end
    
    let c = a
    if a is c then
      // Sim! É verdade!
    End

      Igualdade estrutural

        A verificação da igualdade estrutural no Pony é feita através do operador infix ==. Ele verifica que dois itens têm o mesmo valor. Se a identidade dos itens sendo comparados for a mesma, então por definição eles têm o mesmo valor.
          Você pode definir como a igualdade estrutural é verificada em seu objeto, implementando o eq(que: caixa->Foo) divertido: Bool. Lembre-se, já que == é um operador infix, eq deve ser definido no operando esquerdo, e o operando direito deve ser do tipo Foo.

        class Foo
          let _a: String
        
          new create(a: String) =>
            _a = a
        
          fun eq(that: box->Foo): Bool =>
            this._a == that._a
        
        actor Main
          new create(e: Env) =>
            let a = Foo("hi")
            let b = Foo("bye")
            let c = Foo("hi")
        
            if a == b then
              // won't print
              e.out.print("1")
            end
        
            if a == c then
              // will print
              e.out.print("2")
            end
        
            if a is c then
              // won't print
              e.out.print("3")
            end

          Se você não definir seu próprio eq, você herdará a implementação padrão que define igual por valor como sendo o mesmo que por identidade.

        interface Equatable[A: Equatable[A] #read]
          fun eq(that: box->A): Bool => this is that
          fun ne(that: box->A): Bool => not eq(that)

          Primitivas e igualdade

            Os primitivos são os mesmos que as classes, exceto por duas diferenças importantes:

        • Um primitivo não tem campos.
        • Há apenas uma instância de um primitivo definido pelo usuário.
          • Isto significa que cada primitivo de um determinado tipo é sempre estruturalmente igual e igual com base na identidade. Assim, por exemplo, Nenhum é sempre Nenhum.

          if None is None then
            // this is always true
          end
          
          if None == None then
            // this is also always true
          End