Front page | perl.perl6.language |
Postings from August 2006
Re: === and array-refs
Thread Previous
|
Thread Next
From:
Markus Laire
Date:
August 16, 2006 01:43
Subject:
Re: === and array-refs
Message ID:
67d53e40608160142j45b6eeb6lfa8cd5461043707b@mail.gmail.com
On 8/16/06, Darren Duncan <darren@darrenduncan.net> wrote:
> Both the === and eqv operators test the actual values of 2
> containers, but that their semantics differ in regards to mutable
> containers. Given an immutable container/type, such as a number or
> Str or Seq, both will always return true if the values are the same.
> With a mutable container, such as an Array, only eqv will return true
> if the value is the same, and === will return false for 2 containers
> having the same value.
>
> The difference between === and eqv is that, if you have 2 symbols, $a
> and $b, and $a === $b returns true, then that result is guaranteed to
> be eternal if you don't assign to either symbol afterwards. For a
> mutable type like an Array, === returns false on 2 containers because
> it can't guarantee that someone else holding another symbol for
> either container won't change its content, and so $a or $b could
> change after we made the === test, without us causing that to happen,
> and so for mutable types, === only returns true for 2 aliases,
> because that is the most it can guarantee that they will be the same.
> By contrast, eqv does not make the eternal guarantee, and works only
> on snapshots, so eqv can safely deep-compare mutable types like
> Arrays, since even if one of them changes afterwards, it doesn't
> matter, since eqv only guaranteed them equal for that point in time
> when it executed.
So do you mean that this code
$a = "One";
$b = "One";
$aa := $a;
say "Same before" if $a === $b;
$aa = "Two";
say "Same after" if $a === $b;
would print
Same before
Same after
because here I have "2 symbols, $a and $b, and $a === $b returns true"
and I don't assign to either symbol afterwards - and you seem to be
saying that only with mutable types like Array can you change the
contents via another symbol ($aa here).
But according to S03 this would only print "Same before", because the
assigment to $aa would change $a
<quote>
A new form of assignment is present in Perl 6, called binding, used in
place of typeglob assignment. It is performed with the := operator.
Instead of replacing the value in a container like normal assignment,
it replaces the container itself. For instance:
my $x = 'Just Another';
my $y := $x;
$y = 'Perl Hacker';
After this, both $x and $y contain the string "Perl Hacker", since
they are really just two different names for the same variable.
</quote>
--
Markus Laire
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