Front page | perl.perl6.language |
Postings from August 2006
Re: === and array-refs
Thread Previous
|
Thread Next
From:
David Green
Date:
August 16, 2006 23:43
Subject:
Re: === and array-refs
Message ID:
a06230902c109ac6353f5@[172.27.1.7]
On 8/16/06, David Green wrote:
> $a=[1, 2, \@x];
> $c=[1, 2, \@x];
> $d=[1, 2, \@y];
>
> $a =:= $c; #false, different variables
> $a === $c; #true, same elements make up $a and $c
> $a eqv $c; #true, same elements therefore same values
>
> $a === $d; #false, \@x and \@y are different refs
>
>So $a, $c, and $d may all have the same *value* (or "snapshot", when
>evaluated all the way down through nesting and references), i.e.
>they might be eqv, but only $a and $c are === because they have the
>same contents [unevaluated contents] and $d doesn't.
OK, here's the counter-argument to my incessant ranting:
In the above example, $a and $c do "look" awfully similar, but
suppose we replace the anonymous arrays with named ones:
@X1=(1, 2, \@x);
@X2=(1, 2, \@x);
$a=\@X1;
$b=\@X2;
Now $a clearly does NOT === $b, because @X1 and @X2 are different
variables (that just coincidentally happen to share the same contents
at the moment). Replacing @X1 and @X2 with their anonymous
equivalents shouldn't suddenly change that.
[Well, anonymous object could have different rules, I suppose, but
it's no longer "obvious" that they should. Strings, for example, do
have special treatment to make different string-objects look the
same, but strings can't contain other variables, so it's easy to make
them act like plain values.]
However, it also follows that @X1 !=== @X2. There's no anonymous
reference hiding there, so why aren't @X1 and @X2 the same? (Well,
they just aren't!) So... probably what I wanted all along is just to
compare the contents of an array -- and === just isn't it. Hm.
=:= checks for same variable
=== checks for same object
eqv checks for same value
except that if the operands aren't objects, === will compare them as
values (like eqv). Or rather, if an item is a value (or an object
that ought to act like a value), just make sure its SKID (which ===
uses) compares in an appropriate value-like way.
-David
Thread Previous
|
Thread Next
-
===, =:=, ~~, eq and == revisited (blame ajs!)
by Yuval Kogman
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!) -- Explained
by Yuval Kogman
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!) -- Explained
by David Green
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!) -- Explained
by Larry Wall
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!) -- Explained
by Smylers
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!) -- Explained
by Charles Bailey
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!) -- Explained
by Jonathan Lang
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!)
by Darren Duncan
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!)
by Aaron Sherman
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!)
by Yuval Kogman
-
Re: ===, =:=, ~~, eq and == revisited (blame ajs!)
by Yuval Kogman