On 01/03/2012 12:10 AM, Gou Lingfeng wrote:
> On Mon, 2012-01-02 at 13:18 +0100, Alex Rønne Petersen wrote:
>> On 02-01-2012 06:25, Gou Lingfeng wrote:
>>> D's definitions of "is" and "==" have so much redundency. That might
>>> indicate some flaw. If references and values (for classes and arrays)
>>> could be clearly distinguished in the syntax, the "is" operator is not
>>> necessary at all.
>>
>> Of course it is. 'is' is strictly identity, while == would call an
>> overloaded opEquals, if any exists. This difference in semantics is
>> *very* important when you do *not* want to call opEquals.
>
> My impression is that, in D, references are wrapped (protected)
> pointers, and there are values behind. Although opEquals can be defined
> anyway, it's usually some function depending on the values, not
> pointers. If we could clearly show whether we wan't pointer comparison
> or value comparison, then "a is b" would be "pointer(a)==pointer(b)",
> and "a==b" "value(a)==value(b)".
>
> Or "is" sould evaluate false for "int is int", and true or false for
> expressions like "int is (ref int)" and "(ref int) is (ref int)". So it
> has a consistant meaning everywhere: whether a and b refer to exactly
> the same memory location. And there's no redundency.
>
>
Sortof. There are shortcomings to thinking about it that way ;)
Here's my take:
'is' is the /identity/ operator. It is true when the two operands hold
the same thing, the same instance.
'==' is the /equality/ operator. It is true when the two operands hold
things which are equivalent.
Here is an example:
import std.stdio;
void main()
{
string str1 = "foo";
string str2 = str1.idup;
if ( str1 == str2 ) writeln("str1 == str2");
if ( str1 !is str2 ) writeln("str1 !is str2");
}
It should print this:
str1 == str2
str1 !is str2
In this case the strings are equal because they share the same contents,
but they are not identical because they are different (instances of)
strings.