Here's a way of looking at it that doesn't require you to consider
what happens if you alter the structures.

Let's say you have a Person class with a Name an Age and a House class
with Owner and Resident.

Now imagine there are 2 people who have the same name and age but are
different people.

my $p1 = Person->new(Name => "Fergal Daly", Age => 31);
my $p2 = Person->new(Name => "Fergal Daly", Age => 31);

They live in 2 houses but one of the owns both houses.
my $h1 = House->new(Owner => $p1, Resident => $p1);
my $h2 = House->new(Owner => $p1, Resident => $p2);

The houses look identical if you only consider values however Yves
wants to also consider identities. $h1 is owner-occupied $h2 is
presumably being rented.

Here's what CalculateRent could look like:

sub CalculateRent
{
  my $house = shift;
  if ($house->Owner eq $house->Resident)
  {
    return 0;
  }
  else
  {
    return ValueHouse($house) / 360;
  }
}

so curently

is_deeply($h1, $h2)

passes but

CalculateRent($h1) == CalculateRent($h2)

fails so there it definitely something unequal about $h1 and $h2.
There is a stronger form of equality that could be tested which would
guarantee that if

is_really_deep($h1, $h2)

passes then

AnyFunction($h1) == AnyFunction($h2)

would also pass (assuming there are no conflicting side effects and
assuming nothing looks directly at reference addresses - apart from
debugging, there's no reason to ever do this anyway),

F

 On 7/2/05, Michael Peters <[EMAIL PROTECTED]> wrote:
> demerphq wrote:
> 
> > I wasn't suggesting that this should fail and wouldnt suggest it should 
> > either.
> >
> > I was suggesting that
> >
> > my $a=[];
> > is_deeply([$a,$a],[[],[]])
> 
> So doesn't that just come down to
> is_deeply([], [])
> failing?
> 
> Can we really say that
> x=y; but x,x != y,y?
> 
> If that is the case, the it is completely non-intuitive.
> 
> 
> --
> Michael Peters
> Developer
> Plus Three, LP
> 
>

Reply via email to